/ Hex Artifact Content
Login

Artifact c9ee3c30fbf21ebb4f45c244bd47d7999e6f2704:


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 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
28df0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
28e00 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66  vflPgno);.    if
28e10 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
28e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28e30 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
28e40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
28e50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28e60 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
28e70 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
28e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28e90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
28ea0 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
28eb0 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
28ec0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
28ed0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
28ee0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
28ef0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
28f00 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
28f10 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
28f20 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
28f30 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
28f40 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
28f50 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
28f60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
28f70 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
28f80 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
28f90 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
28fa0 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
28fb0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
28fc0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
28fd0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
28fe0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
28ff0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
29000 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
29010 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
29020 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
29030 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
29040 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
29050 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
29060 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
29070 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
29080 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
29090 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
290a0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
290b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290d0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
290e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
290f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
29100 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
29110 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
29120 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
29130 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
29140 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
29150 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
29160 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
29170 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
29180 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
29190 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
291c0 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
291d0 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
291e0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
29210 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
29220 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
29230 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
29240 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
29250 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
29260 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
29270 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
29280 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
29290 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
292a0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
292b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
292c0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
292d0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
292e0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
292f0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
29300 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
29310 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
29320 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29330 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
29340 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
29350 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
29360 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
29370 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
29380 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
29390 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
293a0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
293b0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
293c0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
293d0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
293e0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
293f0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
29400 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
29410 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
29420 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
29430 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29440 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
29450 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
29460 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
29470 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
29480 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
29490 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
294a0 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
294b0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
294c0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
294d0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
294e0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
294f0 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
29500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
29510 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
29520 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
29530 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
29540 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
29550 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65  *)&nKey);.  btre
29560 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
29570 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
29580 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
29590 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
295a0 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
295b0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
295c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
295d0 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
295e0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
295f0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
29600 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
29610 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
29620 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
29630 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
29640 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
29650 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
29660 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
29670 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
29680 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
29690 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
296a0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
296b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
296c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
296d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
296e0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
296f0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
29700 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
29710 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
29720 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
29730 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
29740 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
29750 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
29760 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
29770 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
29780 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
29790 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
297a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
297b0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
297c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
297d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
297e0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
297f0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
29800 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
29810 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
29820 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
29830 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29840 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
29850 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
29860 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
29870 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
29880 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
29890 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
298a0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
298b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
298c0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
298d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
298e0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
298f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
29900 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
29910 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
29920 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
29930 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
29940 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
29950 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
29960 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
29970 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
29980 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
29990 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
299a0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
299b0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
299c0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
299d0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
299e0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
299f0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
29a00 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
29a10 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
29a20 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
29a30 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
29a40 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
29a50 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
29a60 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
29a70 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
29a80 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
29a90 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
29aa0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
29ab0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
29ac0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
29ad0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
29ae0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
29af0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
29b00 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
29b10 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
29b20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
29b30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29b40 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
29b50 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
29b60 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
29b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29b80 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
29b90 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
29ba0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
29bb0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
29bc0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
29bd0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
29be0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
29bf0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
29c00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29c10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29c20 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
29c30 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
29c40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
29c50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
29c60 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
29c70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29c80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
29c90 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
29ca0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
29cb0 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
29cc0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
29cd0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
29ce0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
29cf0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
29d00 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
29d10 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
29d20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
29d30 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
29d40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29d50 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
29d60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
29d70 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
29d80 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
29d90 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
29da0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
29db0 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
29dc0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
29dd0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
29de0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
29df0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
29e00 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
29e10 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
29e20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
29e30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29e40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
29e50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
29e60 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
29e70 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
29e80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
29e90 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
29ea0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
29eb0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
29ec0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
29ed0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
29ee0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
29ef0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
29f00 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
29f10 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
29f20 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
29f30 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
29f40 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
29f50 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
29f60 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
29f70 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
29f80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
29f90 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
29fa0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
29fb0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
29fc0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
29fd0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
29fe0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
29ff0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2a000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
2a010 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2a020 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2a030 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2a040 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2a050 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
2a060 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
2a070 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2a080 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2a090 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
2a0a0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2a0b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
2a0c0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
2a0d0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
2a0e0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
2a0f0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2a100 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2a110 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2a120 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2a130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2a140 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
2a150 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
2a160 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
2a170 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
2a180 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2a190 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
2a1a0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2a1b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
2a1c0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
2a1d0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2a1e0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
2a1f0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
2a200 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
2a210 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
2a220 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
2a230 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
2a240 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
2a250 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
2a260 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
2a270 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2a280 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
2a290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a2a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2a2b0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
2a2c0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
2a2d0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
2a2e0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
2a2f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2a300 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
2a310 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
2a320 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2a330 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
2a340 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
2a350 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
2a360 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
2a370 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
2a380 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
2a390 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
2a3a0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
2a3b0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
2a3c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2a3d0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
2a3e0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
2a3f0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2a400 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
2a410 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
2a420 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2a430 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2a440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
2a450 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a460 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
2a470 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
2a480 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
2a490 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
2a4a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
2a4b0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
2a4c0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
2a4d0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
2a4e0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
2a4f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2a500 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
2a510 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
2a520 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
2a530 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
2a540 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
2a550 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
2a560 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
2a570 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2a580 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2a590 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2a5a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
2a5b0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
2a5c0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
2a5d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2a5e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2a5f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2a600 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a610 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2a620 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2a630 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2a640 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
2a650 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
2a660 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d  lOffset + 2*idx]
2a670 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
2a680 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
2a690 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2a6a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2a6b0 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
2a6c0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
2a6d0 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
2a6e0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2a6f0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
2a700 63 20 3c 20 67 65 74 32 62 79 74 65 28 26 64 61  c < get2byte(&da
2a710 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
2a720 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
2a730 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2a740 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
2a750 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a760 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2a770 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
2a780 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
2a790 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2a7a0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2a7b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
2a7c0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
2a7d0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
2a7e0 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
2a7f0 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
2a800 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
2a810 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
2a820 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
2a830 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
2a840 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2a850 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2a860 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  += 2;.}../*.** I
2a870 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
2a880 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
2a890 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
2a8a0 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
2a8b0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
2a8c0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
2a8d0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
2a8e0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
2a8f0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
2a900 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
2a910 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
2a920 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
2a930 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
2a940 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
2a950 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
2a960 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
2a970 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
2a980 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
2a990 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
2a9a0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e  Page->aOvfl[] an
2a9b0 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
2a9c0 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
2a9d0 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
2a9e0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
2a9f0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
2aa00 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
2aa10 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
2aa20 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
2aa30 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
2aa40 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
2aa50 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
2aa60 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
2aa70 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
2aa80 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
2aa90 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
2aaa0 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
2aab0 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
2aac0 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
2aad0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
2aae0 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
2aaf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2ab00 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
2ab10 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2ab20 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
2ab30 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
2ab40 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
2ab50 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
2ab60 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
2ab70 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
2ab80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
2ab90 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
2aba0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2abb0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
2abc0 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
2abd0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
2abe0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
2abf0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
2ac00 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
2ac10 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
2ac20 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
2ac30 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
2ac40 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
2ac50 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
2ac60 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
2ac70 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
2ac80 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
2ac90 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
2aca0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
2acb0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
2acc0 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
2acd0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
2ace0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
2acf0 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
2ad00 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
2ad10 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
2ad20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
2ad30 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
2ad40 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
2ad50 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
2ad60 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
2ad70 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
2ad80 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
2ad90 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
2ada0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2adb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2adc0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
2add0 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
2ade0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
2adf0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2ae00 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
2ae10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ae20 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
2ae30 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
2ae40 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
2ae50 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
2ae60 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
2ae70 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
2ae80 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2ae90 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2aea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2aeb0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
2aec0 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
2aed0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
2aee0 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
2aef0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
2af00 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
2af10 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d  /..  int nSkip =
2af20 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30   (iChild ? 4 : 0
2af30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  );..  if( *pRC )
2af40 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2af50 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
2af60 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
2af70 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
2af80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2af90 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
2afa0 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2afb0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2afc0 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
2afd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2afe0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
2aff0 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
2b000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b010 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b020 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2b030 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
2b040 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
2b050 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
2b060 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
2b070 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
2b080 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
2b090 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
2b0a0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
2b0b0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
2b0c0 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
2b0d0 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
2b0e0 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
2b0f0 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
2b100 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
2b110 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
2b120 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
2b130 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
2b140 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
2b150 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
2b160 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
2b170 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
2b180 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2b190 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
2b1a0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2b1b0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2b1c0 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
2b1d0 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
2b1e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2b1f0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
2b200 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
2b210 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
2b220 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
2b230 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
2b240 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2b250 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2b260 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
2b270 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2b280 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
2b290 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
2b2a0 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
2b2b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
2b2c0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
2b2d0 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
2b2e0 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
2b2f0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2b300 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2b310 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
2b320 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
2b330 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
2b340 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
2b350 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
2b360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b370 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2b380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b3a0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2b3b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2b3c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2b3d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b3e0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2b3f0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2b400 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2b410 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2b420 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2b430 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2b440 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2b450 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2b460 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2b470 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2b480 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2b490 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2b4a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2b4b0 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2b4c0 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
2b4d0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
2b4e0 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
2b4f0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
2b500 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
2b510 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
2b520 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
2b530 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
2b540 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
2b550 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
2b560 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2b570 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
2b580 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
2b590 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
2b5a0 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
2b5b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2b5c0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
2b5d0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2b5e0 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69  Skip);.    if( i
2b5f0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
2b600 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
2b610 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
2b620 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64   }.    for(j=end
2b630 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
2b640 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
2b650 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
2b660 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
2b670 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2b680 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
2b690 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2b6a0 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2b6b0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2b6c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2b6d0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2b6e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2b6f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2b700 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2b710 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b720 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2b730 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2b740 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2b750 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2b760 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2b770 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2b780 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2b790 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2b7a0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2b7b0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
2b7c0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
2b7d0 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
2b7e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2b7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2b800 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
2b810 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
2b820 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
2b830 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
2b840 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
2b850 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
2b860 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
2b870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2b880 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
2b890 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
2b8a0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
2b8b0 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
2b8c0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
2b8d0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
2b8e0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
2b8f0 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
2b900 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
2b910 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
2b920 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
2b930 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
2b940 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
2b950 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
2b960 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2b970 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2b980 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
2b990 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
2b9a0 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2b9b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
2b9c0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
2b9d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2b9e0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
2b9f0 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
2ba00 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
2ba10 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
2ba20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2ba30 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
2ba40 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
2ba50 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2ba60 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2ba70 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
2ba80 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
2ba90 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
2baa0 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
2bab0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
2bac0 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
2bad0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
2bae0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2baf0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
2bb00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2bb10 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2bb20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2bb30 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
2bb40 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45   && nCell<=MX_CE
2bb50 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2bb60 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2bb70 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20  >pBt)<=5460 );. 
2bb80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bb90 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bba0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bbb0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
2bbc0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
2bbd0 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
2bbe0 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
2bbf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2bc00 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2bc10 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
2bc20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2bc30 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
2bc40 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74   pCellptr = &dat
2bc50 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2bc60 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
2bc70 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73    cellbody = nUs
2bc80 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  able;.  for(i=nC
2bc90 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ell-1; i>=0; i--
2bca0 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ){.    pCellptr 
2bcb0 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
2bcc0 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  dy -= aSize[i];.
2bcd0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
2bce0 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
2bcf0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2bd00 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
2bd10 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
2bd20 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  ]);.  }.  put2by
2bd30 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2bd40 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
2bd50 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2bd60 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
2bd70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2bd80 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
2bd90 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
2bda0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
2bdb0 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
2bdc0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2bdd0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
2bde0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
2bdf0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
2be00 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
2be10 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
2be20 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
2be30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
2be40 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2be50 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
2be60 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
2be70 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2be80 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2be90 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
2bea0 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
2beb0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
2bec0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
2bed0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
2bee0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
2bef0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2bf00 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
2bf10 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
2bf20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
2bf30 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
2bf40 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
2bf50 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
2bf60 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
2bf70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
2bf80 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
2bf90 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
2bfa0 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
2bfb0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
2bfc0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
2bfd0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
2bfe0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
2bff0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
2c000 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
2c010 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
2c020 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c040 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
2c050 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2c060 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
2c070 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
2c080 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
2c090 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
2c0a0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
2c0b0 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
2c0c0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2c0d0 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
2c0e0 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
2c0f0 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
2c100 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
2c110 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
2c120 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
2c130 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
2c140 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
2c150 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
2c160 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
2c170 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
2c180 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
2c190 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
2c1a0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
2c1b0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
2c1c0 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
2c1d0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
2c1e0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
2c1f0 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
2c200 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
2c210 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
2c220 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
2c230 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
2c240 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
2c250 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
2c260 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
2c270 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
2c280 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
2c290 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
2c2a0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
2c2b0 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
2c2c0 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
2c2d0 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
2c2e0 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
2c2f0 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
2c300 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
2c310 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
2c320 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
2c330 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
2c340 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
2c350 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
2c360 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
2c370 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
2c380 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
2c390 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
2c3a0 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
2c3b0 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
2c3c0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2c3d0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
2c3e0 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
2c3f0 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
2c400 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
2c410 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
2c420 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
2c430 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
2c440 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
2c450 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
2c460 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
2c470 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
2c480 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
2c490 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2c4a0 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
2c4b0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
2c4c0 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
2c4d0 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
2c4e0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
2c4f0 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
2c500 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
2c510 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2c520 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
2c530 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
2c540 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
2c550 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
2c560 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
2c570 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
2c580 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
2c590 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2c5a0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2c5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2c5c0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
2c5d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c600 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2c610 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c630 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2c640 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
2c650 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c660 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2c670 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2c680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c690 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c6a0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2c6b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2c6c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2c6d0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69  rflow==1 );..  i
2c6e0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  f( pPage->nCell<
2c6f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2c700 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c710 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2c720 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73  a new page. This
2c730 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2c740 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c  e the right-sibl
2c750 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61  ing of .  ** pPa
2c760 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72  ge. Make the par
2c770 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c  ent page writabl
2c780 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  e, so that the n
2c790 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  ew divider cell.
2c7a0 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65    ** may be inse
2c7b0 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68  rted. If both th
2c7c0 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ese operations a
2c7d0 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  re successful, p
2c7e0 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72  roceed..  */.  r
2c7f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2c800 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
2c810 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
2c820 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2c830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
2c840 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61  u8 *pOut = &pSpa
2c850 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70  ce[4];.    u8 *p
2c860 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
2c870 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2c880 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
2c890 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2c8a0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
2c8b0 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
2c8c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2c8d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
2c8e0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
2c8f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c900 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
2c910 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2c920 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
2c930 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2c940 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
2c950 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2c960 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
2c970 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
2c980 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
2c990 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
2c9a0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2c9b0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2c9c0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2c9d0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
2c9e0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
2c9f0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
2ca00 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
2ca10 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
2ca20 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
2ca30 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2ca40 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
2ca50 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
2ca60 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
2ca70 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2ca80 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
2ca90 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
2caa0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2cab0 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
2cac0 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
2cad0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
2cae0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
2caf0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
2cb00 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2cb10 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
2cb20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
2cb30 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
2cb40 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
2cb50 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
2cb60 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
2cb70 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
2cb80 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
2cb90 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
2cba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2cbb0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2cbc0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2cbd0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
2cbe0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
2cbf0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
2cc00 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
2cc10 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
2cc20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2cc30 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
2cc40 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
2cc50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2cc60 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
2cc70 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
2cc80 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
2cc90 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
2cca0 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
2ccb0 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
2ccc0 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
2ccd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
2cce0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
2ccf0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2cd00 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
2cd10 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
2cd20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
2cd30 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
2cd40 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
2cd50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
2cd60 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
2cd70 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
2cd80 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
2cd90 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2cda0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2cdb0 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
2cdc0 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
2cdd0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
2cde0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
2cdf0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
2ce00 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2ce10 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
2ce20 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
2ce30 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
2ce40 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
2ce50 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
2ce60 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
2ce70 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
2ce80 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
2ce90 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
2cea0 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
2ceb0 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
2cec0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
2ced0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
2cee0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
2cef0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
2cf00 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
2cf10 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
2cf20 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
2cf30 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
2cf40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2cf50 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
2cf60 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
2cf70 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2cf80 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
2cf90 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
2cfa0 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
2cfb0 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2cfc0 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2cfd0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
2cfe0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
2cff0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2d000 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
2d010 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2d020 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
2d030 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
2d040 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
2d050 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
2d060 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
2d070 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
2d080 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
2d090 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
2d0a0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2d0b0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
2d0c0 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
2d0d0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2d0e0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2d0f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
2d100 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2d110 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
2d120 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
2d130 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2d140 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2d150 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
2d160 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d170 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
2d180 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2d190 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2d1a0 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
2d1b0 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
2d1c0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2d1d0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
2d1e0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
2d1f0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
2d200 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
2d210 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
2d220 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
2d230 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
2d240 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
2d250 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
2d260 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2d270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2d280 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
2d290 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
2d2a0 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
2d2b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
2d2c0 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
2d2d0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
2d2e0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
2d2f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2d300 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
2d310 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d320 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
2d330 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2d340 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
2d350 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
2d360 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
2d370 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2d380 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
2d390 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
2d3a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
2d3b0 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
2d3c0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2d3d0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
2d3e0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
2d3f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
2d400 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
2d410 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
2d420 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
2d430 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2d440 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
2d450 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d460 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2d470 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
2d480 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
2d490 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
2d4a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d4b0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2d4c0 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
2d4d0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2d4e0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2d4f0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2d500 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2d510 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2d520 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
2d530 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2d540 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d550 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2d560 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2d570 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2d580 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2d590 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2d5a0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2d5b0 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
2d5c0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2d5d0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2d5e0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
2d5f0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2d600 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2d610 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2d620 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
2d630 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2d640 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
2d650 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
2d660 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2d670 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
2d680 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
2d690 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
2d6a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2d6b0 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
2d6c0 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
2d6d0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2d6e0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
2d6f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
2d700 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
2d710 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
2d720 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
2d730 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
2d740 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2d750 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
2d760 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
2d770 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
2d780 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
2d790 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
2d7a0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
2d7b0 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
2d7c0 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
2d7d0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
2d7e0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2d7f0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
2d800 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c  ** MemPage.aOvfl
2d810 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
2d820 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
2d830 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
2d840 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
2d850 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
2d860 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
2d870 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
2d880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
2d890 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
2d8a0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
2d8b0 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
2d8c0 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
2d8d0 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
2d8e0 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
2d8f0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
2d900 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
2d910 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
2d920 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
2d930 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
2d940 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
2d950 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64  tic void copyNod
2d960 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
2d970 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
2d980 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29   *pTo, int *pRC)
2d990 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2d9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d9b0 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
2d9c0 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
2d9d0 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  Bt;.    u8 * con
2d9e0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2d9f0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
2da00 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
2da10 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e  o->aData;.    in
2da20 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
2da30 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
2da40 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  set;.    int con
2da50 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
2da60 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
2da70 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  0 : 0);.    int 
2da80 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74  rc;.    int iDat
2da90 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
2daa0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
2dab0 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
2dac0 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2dad0 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
2dae0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2daf0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2db00 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ])<=pBt->usableS
2db10 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
2db20 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2db30 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2db40 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2db50 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2db60 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2db70 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2db80 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
2db90 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2dba0 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2dbb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2dbc0 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
2dbd0 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
2dbe0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
2dbf0 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
2dc00 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
2dc10 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
2dc20 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2dc30 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2dc40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2dc50 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2dc60 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
2dc70 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2dc80 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2dc90 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
2dca0 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
2dcb0 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
2dcc0 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
2dcd0 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
2dce0 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
2dcf0 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
2dd00 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
2dd10 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
2dd20 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2dd30 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
2dd40 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
2dd50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dd60 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2dd70 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2dd80 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
2dd90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2dda0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2ddb0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2ddc0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2ddd0 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
2dde0 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
2ddf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
2de00 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
2de10 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2de20 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
2de30 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2de40 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
2de50 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2de60 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
2de70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2de80 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2de90 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2dea0 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2deb0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2dec0 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2ded0 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2dee0 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2def0 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2df00 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2df10 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2df20 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2df30 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2df40 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2df50 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2df60 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2df70 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2df80 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2df90 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2dfa0 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2dfb0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2dfc0 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2dfd0 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2dfe0 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2dff0 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2e000 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2e010 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2e020 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2e030 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2e040 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2e050 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2e060 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2e070 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2e080 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
2e090 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2e0a0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
2e0b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
2e0c0 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
2e0d0 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
2e0e0 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
2e0f0 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
2e100 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
2e110 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
2e120 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
2e130 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
2e140 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2e150 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2e160 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2e170 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
2e180 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
2e190 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
2e1a0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
2e1b0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
2e1c0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
2e1d0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
2e1e0 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
2e1f0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2e200 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
2e210 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
2e220 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2e230 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
2e240 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
2e250 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
2e260 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
2e270 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
2e280 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
2e290 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
2e2a0 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
2e2b0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
2e2c0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2e2d0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
2e2e0 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
2e2f0 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
2e300 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
2e310 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
2e320 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
2e330 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
2e340 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
2e350 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
2e360 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
2e370 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
2e380 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
2e390 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
2e3a0 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
2e3b0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
2e3c0 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
2e3d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2e3e0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2e3f0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2e400 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2e410 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2e420 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2e430 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2e440 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2e450 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2e460 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2e470 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
2e480 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2e490 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
2e4a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2e4b0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
2e4c0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
2e4d0 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
2e4e0 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
2e4f0 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2e500 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
2e510 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
2e520 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2e530 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2e540 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2e550 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2e560 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
2e570 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
2e580 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
2e590 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
2e5a0 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
2e5b0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
2e5c0 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
2e5d0 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
2e5e0 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
2e5f0 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
2e600 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
2e610 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
2e620 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
2e630 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
2e640 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
2e650 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2e660 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
2e670 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
2e680 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
2e690 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
2e6a0 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
2e6b0 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
2e6c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2e6d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2e6e0 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
2e6f0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2e700 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2e710 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
2e720 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
2e730 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
2e740 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2e750 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
2e760 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2e770 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
2e780 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
2e790 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
2e7a0 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
2e7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
2e7c0 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
2e7d0 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
2e7e0 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
2e7f0 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
2e800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e810 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
2e820 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
2e830 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2e840 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
2e850 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
2e860 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
2e870 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
2e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e890 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
2e8a0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
2e8b0 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
2e8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2e8d0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
2e8e0 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
2e8f0 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
2e900 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
2e910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e920 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2e930 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
2e940 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
2e950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e960 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
2e970 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
2e980 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
2e990 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2e9a0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2e9b0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
2e9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e9d0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
2e9e0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
2e9f0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
2ea00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2ea10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2ea20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
2ea30 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
2ea40 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
2ea50 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2ea60 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
2ea70 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
2ea80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ea90 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
2eaa0 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
2eab0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
2eac0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
2ead0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2eae0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
2eaf0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
2eb00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
2eb10 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
2eb20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2eb30 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
2eb40 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
2eb50 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
2eb60 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
2eb70 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
2eb80 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
2eb90 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
2eba0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ebb0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2ebc0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
2ebd0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
2ebe0 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
2ebf0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2ec00 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
2ec10 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
2ec20 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ec40 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
2ec50 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
2ec60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2ec70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
2ec80 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2ec90 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
2eca0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2ecb0 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
2ecc0 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
2ecd0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
2ece0 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
2ecf0 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
2ed00 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
2ed10 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
2ed20 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
2ed30 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
2ed40 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
2ed50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2ed60 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
2ed70 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
2ed80 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
2ed90 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
2eda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2edb0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
2edc0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
2edd0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
2ede0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2edf0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
2ee00 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
2ee10 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
2ee20 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2ee30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
2ee40 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
2ee50 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
2ee60 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2ee70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2ee80 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2ee90 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
2eea0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2eeb0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2eec0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2eed0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
2eee0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2eef0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef10 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
2ef20 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
2ef30 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
2ef40 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2ef50 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
2ef60 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
2ef70 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
2ef80 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
2ef90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
2efa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2efb0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2efc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2efd0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2efe0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2eff0 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
2f000 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2f010 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
2f020 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
2f030 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
2f040 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
2f050 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
2f060 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
2f070 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
2f080 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
2f090 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
2f0a0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
2f0b0 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
2f0c0 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
2f0d0 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
2f0e0 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
2f0f0 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
2f100 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
2f110 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
2f120 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
2f130 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
2f140 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2f150 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
2f160 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
2f170 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
2f180 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2f190 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2f1a0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2f1b0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
2f1c0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
2f1d0 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
2f1e0 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
2f1f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2f200 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2f210 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
2f220 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
2f230 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
2f240 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
2f250 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
2f260 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
2f270 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
2f280 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2f290 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
2f2a0 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
2f2b0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
2f2c0 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
2f2d0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
2f2e0 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
2f2f0 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
2f300 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
2f310 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
2f320 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
2f330 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
2f340 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
2f350 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
2f360 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
2f370 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
2f380 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2f390 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
2f3a0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2f3b0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
2f3c0 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
2f3d0 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
2f3e0 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
2f3f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
2f400 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
2f410 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
2f420 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
2f430 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
2f440 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
2f450 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
2f460 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2f470 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
2f480 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
2f490 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
2f4a0 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
2f4b0 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
2f4c0 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
2f4d0 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
2f4e0 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
2f4f0 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
2f500 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
2f510 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
2f520 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
2f530 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
2f540 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
2f550 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
2f560 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
2f570 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
2f580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
2f590 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
2f5a0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2f5b0 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
2f5c0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2f5d0 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
2f5e0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2f5f0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
2f600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
2f610 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
2f620 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2f630 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2f640 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
2f650 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
2f660 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
2f670 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
2f680 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2f690 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
2f6a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2f6b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
2f6c0 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
2f6d0 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
2f6e0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2f6f0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2f700 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
2f710 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
2f720 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
2f730 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
2f740 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
2f750 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
2f760 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2f770 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70  Ovfl[0].idx && p
2f780 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f790 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
2f7a0 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
2f7b0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2f7c0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
2f7d0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2f7e0 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
2f7f0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2f800 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
2f810 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
2f820 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
2f830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f840 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
2f850 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
2f860 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2f870 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
2f880 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2f890 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2f8a0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
2f8b0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2f8c0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
2f8d0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
2f8e0 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
2f8f0 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
2f900 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
2f910 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
2f920 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
2f930 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
2f940 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
2f950 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
2f960 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
2f970 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
2f980 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
2f990 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
2f9a0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
2f9b0 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
2f9c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f9d0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
2f9e0 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
2f9f0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
2fa00 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
2fa10 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
2fa20 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
2fa30 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
2fa40 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2fa50 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74   ** Unless SQLit
2fa60 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  e is compiled in
2fa70 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2fa80 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2fa90 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
2faa0 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
2fab0 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
2fac0 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
2fad0 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
2fae0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
2faf0 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
2fb00 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
2fb10 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
2fb20 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
2fb30 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
2fb40 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
2fb50 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
2fb60 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
2fb70 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
2fb80 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
2fb90 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75     if( pBt->secu
2fba0 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
2fbb0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
2fbc0 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
2fbd0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 2c  pParent->aData],
2fbe0 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
2fbf0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 61 70  [i]);.        ap
2fc00 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
2fc10 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
2fc20 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
2fc30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
2fc40 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
2fc50 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2fc60 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
2fc70 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
2fc80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
2fc90 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
2fca0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
2fcb0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
2fcc0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
2fcd0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
2fce0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
2fcf0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
2fd00 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
2fd10 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
2fd20 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
2fd30 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
2fd40 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
2fd50 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2fd60 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
2fd70 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
2fd80 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
2fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fda0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
2fdb0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
2fdc0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fde0 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
2fdf0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe20 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
2fe30 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
2fe70 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
2fe80 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
2fe90 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
2fea0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
2feb0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
2fec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2fed0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
2fee0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2fef0 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
2ff00 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
2ff10 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
2ff20 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
2ff30 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
2ff40 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2ff50 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
2ff60 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
2ff70 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
2ff80 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
2ff90 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
2ffa0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
2ffb0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
2ffc0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
2ffd0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
2ffe0 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
2fff0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
30000 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
30010 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
30020 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
30030 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
30040 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
30050 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
30060 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
30070 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
30080 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
30090 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
300a0 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
300b0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
300c0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
300d0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
300e0 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
300f0 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
30100 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
30110 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
30120 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
30130 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
30140 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
30150 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
30160 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
30170 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
30180 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
30190 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
301a0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
301b0 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
301c0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
301d0 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
301e0 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
301f0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
30200 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
30210 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
30220 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
30230 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
30240 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
30250 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
30260 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72  ..  */.  leafCor
30270 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b  rection = apOld[
30280 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  0]->leaf*4;.  le
30290 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30  afData = apOld[0
302a0 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  ]->hasData;.  fo
302b0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
302c0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  ++){.    int lim
302d0 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  it;.    .    /* 
302e0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
302f0 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65  thing else, take
30300 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
30310 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62  'th original sib
30320 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20  ling.    ** The 
30330 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
30340 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
30350 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
30360 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a  ies rather.    *
30370 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
30380 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
30390 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
303a0 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
303b0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
303c0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
303d0 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d  itten.  */.    M
303e0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
303f0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
30400 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42  age*)&aSpace1[pB
30410 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a  t->pageSize + k*
30420 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
30430 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  Old, apOld[i], s
30440 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
30450 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61  .    pOld->aData
30460 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b   = (void*)&pOld[
30470 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
30480 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  Old->aData, apOl
30490 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
304a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
304b0 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e    limit = pOld->
304c0 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
304d0 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
304e0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
304f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30500 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
30510 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
30520 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
30530 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
30540 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
30550 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
30560 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
30570 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
30580 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
30590 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
305a0 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29  -1 && !leafData)
305b0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
305c0 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a   (u16)szNew[i];.
305d0 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
305e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
305f0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
30600 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
30610 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
30620 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
30630 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
30640 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
30650 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30660 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
30670 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
30680 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
30690 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
306a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
306b0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
306c0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
306d0 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
306e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
306f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
30700 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
30710 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
30720 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
30730 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
30740 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
30750 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
30760 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
30770 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
30780 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
30790 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
307a0 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
307b0 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
307c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
307d0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
307e0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
307f0 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
30800 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
30810 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
30820 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
30830 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
30840 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
30850 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
30860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
30880 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
30890 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
308a0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
308b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
308c0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
308d0 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
308e0 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
308f0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
30900 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
30910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30920 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
30930 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
30940 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
30950 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
30960 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
30970 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
30980 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
30990 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
309a0 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
309b0 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
309c0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
309d0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
309e0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
309f0 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
30a00 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
30a10 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
30a20 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
30a30 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
30a40 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
30a50 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
30a60 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
30a70 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
30a80 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
30a90 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
30aa0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
30ab0 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
30ac0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
30ad0 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
30ae0 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
30af0 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
30b00 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
30b10 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
30b20 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
30b30 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
30b40 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
30b50 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
30b60 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
30b70 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
30b80 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
30b90 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
30ba0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
30bb0 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
30bc0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
30bd0 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
30be0 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
30bf0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
30c00 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
30c10 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
30c20 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
30c30 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
30c40 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
30c50 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
30c60 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
30c70 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
30c80 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
30c90 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
30ca0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
30cb0 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
30cc0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
30cd0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
30ce0 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
30cf0 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
30d00 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
30d10 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
30d20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
30d30 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c  ORRUPT; goto bal
30d40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
30d50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
30d60 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
30d70 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
30d80 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
30d90 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
30da0 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
30db0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
30dc0 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
30dd0 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
30de0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
30df0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
30e00 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
30e10 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
30e20 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
30e30 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
30e40 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
30e50 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
30e60 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
30e70 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
30e80 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
30e90 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
30ea0 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
30eb0 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
30ec0 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
30ed0 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
30ee0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
30ef0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
30f00 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
30f10 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
30f20 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
30f30 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
30f40 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
30f50 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
30f60 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
30f70 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
30f80 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
30f90 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
30fa0 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
30fb0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
30fc0 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
30fd0 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
30fe0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
30ff0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
31000 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
31010 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
31020 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
31030 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
31040 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
31050 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
31060 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
31070 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
31080 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
31090 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
310a0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
310b0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
310c0 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
310d0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
310e0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
310f0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
31100 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
31110 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
31120 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
31130 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
31140 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
31150 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
31160 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
31170 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
31180 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
31190 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
311a0 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
311b0 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
311c0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
311d0 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
311e0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
311f0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
31200 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
31210 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
31220 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
31230 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
31240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
31250 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
31260 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
31270 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
31280 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
31290 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
312a0 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
312b0 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
312c0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
312d0 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
312e0 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
312f0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
31300 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
31310 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
31320 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
31330 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
31340 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
31350 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
31360 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
31370 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c   %d  ",.    apOl
31380 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20  d[0]->pgno, .   
31390 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64   nOld>=2 ? apOld
313a0 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20  [1]->pgno : 0,. 
313b0 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f     nOld>=3 ? apO
313c0 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a  ld[2]->pgno : 0.
313d0 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a    ));..  /*.  **
313e0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
313f0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
31400 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
31410 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
31420 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e  f( apOld[0]->pgn
31430 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  o<=1 ){.    rc =
31440 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
31450 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
31460 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
31470 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f   pageFlags = apO
31480 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b  ld[0]->aData[0];
31490 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
314a0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
314b0 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
314c0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
314d0 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
314e0 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
314f0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
31500 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
31510 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31520 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
31530 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
31540 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31550 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31570 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
31580 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
31590 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
315a0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
315b0 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  , pgno, 0);.    
315c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
315d0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
315e0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
315f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
31600 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew++;..      /* 
31610 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
31620 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
31630 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
31640 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ge. */.      if(
31650 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
31660 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
31670 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67  ut(pBt, pNew->pg
31680 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
31690 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
316a0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
316b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
316c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
316d0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
316e0 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
316f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
31700 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
31710 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
31720 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
31730 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
31740 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
31750 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65   ){.    freePage
31760 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b  (apOld[i], &rc);
31770 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
31780 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31790 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
317a0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
317b0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
317c0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
317d0 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
317e0 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
317f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
31800 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
31810 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
31820 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
31830 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
31840 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
31850 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
31860 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
31870 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
31880 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
31890 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
318a0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
318b0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
318c0 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
318d0 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
318e0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
318f0 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
31900 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
31910 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
31920 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
31930 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
31940 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
31950 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
31960 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
31970 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
31980 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
31990 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
319a0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
319b0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
319c0 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
319d0 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
319e0 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
319f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
31a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
31a10 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d  minV = apNew[i]-
31a20 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d  >pgno;.    int m
31a30 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
31a40 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
31a50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  ){.      if( apN
31a60 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73  ew[j]->pgno<(uns
31a70 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
31a80 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
31a90 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61          minV = a
31aa0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[j]->pgno;. 
31ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31ac0 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
31ad0 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
31ae0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
31af0 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69       t = apNew[i
31b00 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70  ]->pgno;.      p
31b10 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
31b20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
31b30 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
31b40 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
31b50 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
31b60 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28  TRACE(("new: %d(
31b70 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
31b80 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
31b90 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d  n",.    apNew[0]
31ba0 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d  ->pgno, szNew[0]
31bb0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
31bc0 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apNew[1]->pgno :
31bd0 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
31be0 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
31bf0 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b  nNew>=3 ? apNew[
31c00 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  2]->pgno : 0, nN
31c10 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
31c20 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
31c30 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67  4 ? apNew[3]->pg
31c40 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  no : 0, nNew>=4 
31c50 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
31c60 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70      nNew>=5 ? ap
31c70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[4]->pgno : 0
31c80 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
31c90 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61  w[4] : 0));..  a
31ca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
31cb0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
31cc0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
31cd0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70   );.  put4byte(p
31ce0 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65  Right, apNew[nNe
31cf0 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  w-1]->pgno);..  
31d00 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
31d10 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
31d20 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
31d30 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
31d40 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
31d50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
31d60 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
31d70 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
31d80 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
31d90 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
31da0 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
31db0 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
31dc0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
31dd0 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
31de0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
31df0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
31e00 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
31e10 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
31e20 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
31e30 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
31e40 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
31e50 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
31e60 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
31e70 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
31e80 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
31e90 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
31ea0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
31eb0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
31ec0 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
31ed0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
31ee0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
31ef0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
31f00 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
31f10 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
31f20 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
31f30 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
31f40 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
31f50 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
31f60 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d   i<nNew-1 || j==
31f70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
31f80 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
31f90 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
31fa0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
31fb0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
31fc0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
31fd0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
31fe0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
31ff0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
32000 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
32010 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
32020 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70  pTemp = &aOvflSp
32030 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b  ace[iOvflSpace];
32040 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
32050 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
32060 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
32070 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
32080 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
32090 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
320a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
320b0 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
320c0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
320d0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
320e0 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
320f0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
32100 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
32110 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
32120 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
32130 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
32140 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
32150 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
32160 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
32170 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
32180 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
32190 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
321a0 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
321b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
321c0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
321d0 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
321e0 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
321f0 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
32200 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
32210 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
32220 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
32230 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61    sz = 4 + putVa
32240 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
32250 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20  info.nKey);.    
32260 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
32270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32280 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
32290 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
322a0 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
322b0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
322c0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
322d0 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
322e0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
322f0 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
32300 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
32310 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
32320 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
32330 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
32340 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
32350 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
32360 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
32370 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
32380 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
32390 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
323a0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
323b0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
323c0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
323d0 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
323e0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
323f0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
32400 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
32410 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
32420 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32430 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
32440 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
32450 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
32460 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
32470 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
32480 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
32490 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
324a0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
324b0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
324c0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
324d0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
324e0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
324f0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
32500 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
32510 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
32520 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
32530 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
32540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
32550 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
32560 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
32570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32580 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63  .      iOvflSpac
32590 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  e += sz;.      a
325a0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
325b0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
325c0 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66      assert( iOvf
325d0 6c 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67  lSpace<=pBt->pag
325e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
325f0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
32600 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
32610 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
32620 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
32630 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32640 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
32650 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32660 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
32670 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32680 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
32690 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
326a0 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
326b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
326c0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
326d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
326e0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
326f0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
32700 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
32710 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
32720 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
32730 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
32740 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
32750 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
32760 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
32770 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
32780 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
32790 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
327a0 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
327b0 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
327c0 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
327d0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
327e0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
327f0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
32800 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
32810 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
32820 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
32830 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
32840 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
32850 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
32860 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
32870 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
32880 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
32890 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
328a0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
328b0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
328c0 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
328d0 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
328e0 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
328f0 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
32900 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
32910 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
32920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
32930 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
32940 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
32950 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
32960 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
32970 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
32980 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32990 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
329a0 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
329b0 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
329c0 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
329d0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
329e0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
329f0 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
32a00 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
32a10 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
32a20 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
32a30 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
32a40 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
32a50 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
32a60 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
32a70 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
32a80 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
32a90 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
32aa0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
32ab0 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
32ac0 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
32ad0 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
32ae0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
32af0 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
32b00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
32b10 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
32b20 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
32b30 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
32b40 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
32b50 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
32b60 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
32b70 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
32b80 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
32b90 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
32ba0 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
32bb0 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  arent, &rc);.   
32bc0 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b   freePage(apNew[
32bd0 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73  0], &rc);.  }els
32be0 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
32bf0 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
32c00 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
32c10 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
32c20 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
32c30 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
32c40 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
32c50 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
32c60 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
32c70 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
32c80 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
32c90 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
32ca0 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
32cb0 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
32cc0 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
32cd0 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
32ce0 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
32cf0 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
32d00 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
32d10 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
32d20 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
32d30 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32d40 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
32d50 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
32d60 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
32d70 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
32d80 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
32d90 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
32da0 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
32db0 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
32dc0 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
32dd0 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
32de0 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
32df0 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
32e00 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
32e10 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
32e20 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
32e30 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
32e40 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
32e50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32e60 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
32e70 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
32e80 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
32e90 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
32ea0 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
32eb0 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
32ec0 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
32ed0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
32ee0 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
32ef0 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
32f00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
32f10 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
32f20 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
32f30 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
32f40 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
32f50 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
32f60 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
32f70 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
32f80 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
32f90 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
32fa0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32fb0 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
32fc0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
32fd0 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
32fe0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32ff0 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
33000 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
33010 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
33020 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
33030 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
33040 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
33050 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
33060 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
33070 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
33080 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
33090 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
330a0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
330b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
330c0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
330d0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
330e0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
330f0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
33100 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
33110 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
33120 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
33130 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
33140 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
33150 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
33160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
33170 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
33180 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
33190 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
331a0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
331b0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
331c0 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
331d0 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
331e0 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
331f0 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
33200 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
33210 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
33220 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
33230 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
33240 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
33250 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
33260 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
33270 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
33280 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
33290 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
332a0 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61  moved between pa
332b0 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ges.  */.    Mem
332c0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
332d0 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61  ew[0];.    MemPa
332e0 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
332f0 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f  y[0];.    int nO
33300 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
33310 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
33320 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f  nt iNextOld = pO
33330 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65  ld->nCell + nOve
33340 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
33350 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65  Overflow = (nOve
33360 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f  rflow ? pOld->aO
33370 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29  vfl[0].idx : -1)
33380 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20  ;.    j = 0;    
33390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
333b0 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e  ent 'old' siblin
333c0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20  g page */.    k 
333d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333f0 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77   /* Current 'new
33400 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
33410 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
33420 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
33430 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65      int isDivide
33440 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  r = 0;.      whi
33450 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20  le( i==iNextOld 
33460 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
33470 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
33480 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
33490 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
334a0 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20  cell on old.    
334b0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
334c0 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69  age j. If the si
334d0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
334e0 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
334f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
33500 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
33510 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69  ell i was a divi
33520 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  der cell. */.   
33530 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f       pOld = apCo
33540 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20  py[++j];.       
33550 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20   iNextOld = i + 
33560 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
33570 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e  ->nCell + pOld->
33580 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
33590 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
335a0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
335b0 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20      nOverflow = 
335c0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
335d0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
335e0 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66  flow = i + !leaf
335f0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76  Data + pOld->aOv
33600 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20  fl[0].idx;.     
33610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
33620 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
33630 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
33640 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
33650 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
33660 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
33670 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
33680 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <2 || pOld->aOvf
33690 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[0].idx==pOld->
336a0 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b  aOvfl[1].idx-1);
336b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
336c0 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c  verflow<3 || pOl
336d0 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d  d->aOvfl[1].idx=
336e0 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e  =pOld->aOvfl[2].
336f0 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  idx-1);.      if
33700 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29  ( i==iOverflow )
33710 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  {.        isDivi
33720 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
33730 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f   if( (--nOverflo
33740 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w)>0 ){.        
33750 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20    iOverflow++;. 
33760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33770 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63  ..      if( i==c
33780 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20  ntNew[k] ){.    
33790 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
337a0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
337b0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
337c0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
337d0 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
337e0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20  sibling page k. 
337f0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
33800 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
33810 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
33820 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
33830 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69  e, then cell i i
33840 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
33850 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
33860 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b  ew = apNew[++k];
33870 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
33880 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75  afData ) continu
33890 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
338a0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20   assert( j<nOld 
338b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
338c0 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20   k<nNew );..    
338d0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
338e0 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
338f0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e  divider cell (an
33900 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72  d is not now) or
33910 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65  .      ** an ove
33920 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69  rflow cell, or i
33930 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c  f the cell was l
33940 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66  ocated on a diff
33950 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20  erent sibling.  
33960 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f      ** page befo
33970 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  re the balancing
33980 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
33990 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er map entries a
339a0 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
339b0 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c  ** with any chil
339c0 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
339d0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ges need to be u
339e0 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
339f0 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20    if( isDivider 
33a00 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70  || pOld->pgno!=p
33a10 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
33a20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f       if( !leafCo
33a30 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
33a40 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
33a50 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
33a60 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
33a70 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
33a80 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
33a90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
33aa0 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  szCell[i]>pNew->
33ab0 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
33ac0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
33ad0 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  vflPtr(pNew, apC
33ae0 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  ell[i], &rc);.  
33af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33b00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33b10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
33b20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
33b30 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
33b40 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d         u32 key =
33b50 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77   get4byte(&apNew
33b60 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  [i]->aData[8]);.
33b70 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
33b80 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d  t(pBt, key, PTRM
33b90 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
33ba0 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  i]->pgno, &rc);.
33bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
33bc0 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
33bd0 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
33be0 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
33bf0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
33c00 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
33c10 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
33c20 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
33c30 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
33c40 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
33c50 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
33c60 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
33c70 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
33c80 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
33c90 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
33ca0 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
33cb0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
33cc0 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
33cd0 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
33ce0 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
33cf0 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
33d00 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
33d10 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
33d20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
33d30 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
33d40 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
33d50 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
33d60 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
33d70 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
33d80 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
33d90 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
33da0 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
33db0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
33dc0 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
33dd0 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
33de0 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
33df0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
33e00 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
33e10 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
33e20 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
33e30 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
33e40 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
33e50 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
33e60 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33e70 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
33e80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33e90 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70   when the root p
33ea0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20  age of a b-tree 
33eb0 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20  structure is.** 
33ec0 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e  overfull (has on
33ed0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
33ee0 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a  ow pages)..**.**
33ef0 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   A new child pag
33f00 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  e is allocated a
33f10 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
33f20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
33f30 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63  oot.** page, inc
33f40 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
33f50 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65  cells, are copie
33f60 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  d into the child
33f70 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  . The root.** pa
33f80 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77  ge is then overw
33f90 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69  ritten to make i
33fa0 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  t an empty page 
33fb0 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63  with the right-c
33fc0 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  hild .** pointer
33fd0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
33fe0 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   new page..**.**
33ff0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
34000 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  g, all pointer-m
34010 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
34020 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
34030 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  s .** that the n
34040 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f  ew child-page no
34050 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  w contains point
34060 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74  ers to are updat
34070 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79  ed. The.** entry
34080 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
34090 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  o the new right-
340a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
340b0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
340c0 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  e is also update
340d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
340e0 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64  essful, *ppChild
340f0 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61   is set to conta
34100 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
34110 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20  o the child .** 
34120 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  page and SQLITE_
34130 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
34140 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34150 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69   caller is requi
34160 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72  red.** to call r
34170 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20  eleasePage() on 
34180 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79  *ppChild exactly
34190 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72   once. If an err
341a0 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e  or occurs,.** an
341b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
341c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43  eturned and *ppC
341d0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30  hild is set to 0
341e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
341f0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
34200 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d  emPage *pRoot, M
34210 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64  emPage **ppChild
34220 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34240 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
34250 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
34260 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
34270 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b  age *pChild = 0;
34280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34290 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
342a0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
342b0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
342c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
342d0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
342e0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
342f0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
34300 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70   *pBt = pRoot->p
34310 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54  Bt;    /* The BT
34320 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ree */..  assert
34330 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  ( pRoot->nOverfl
34340 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ow>0 );.  assert
34350 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34360 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
34370 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70   );..  /* Make p
34380 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70  Root, the root p
34390 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
343a0 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c  e, writable. All
343b0 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  ocate a new .  *
343c0 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  * page that will
343d0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
343e0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
343f0 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63  Page. Copy the c
34400 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
34410 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  the node stored 
34420 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68  on pRoot into th
34430 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
34440 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
34450 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34460 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
34470 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
34480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
34490 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
344a0 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
344b0 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
344c0 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f  >pgno,0);.    co
344d0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  pyNodeContent(pR
344e0 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63  oot, pChild, &rc
344f0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
34500 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
34510 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34520 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
34530 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
34540 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
34550 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
34560 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d  {.    *ppChild =
34570 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
34580 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
34590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
345a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
345b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
345c0 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
345d0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
345e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
345f0 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70  iteable(pRoot->p
34600 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
34610 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65  ert( pChild->nCe
34620 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  ll==pRoot->nCell
34630 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
34640 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
34650 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
34660 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43   pRoot->pgno, pC
34670 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20  hild->pgno));.. 
34680 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65   /* Copy the ove
34690 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d  rflow cells from
346a0 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64   pRoot to pChild
346b0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68   */.  memcpy(pCh
346c0 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  ild->aOvfl, pRoo
346d0 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d  t->aOvfl, pRoot-
346e0 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
346f0 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30  f(pRoot->aOvfl[0
34700 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
34710 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74  Overflow = pRoot
34720 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20  ->nOverflow;..  
34730 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74  /* Zero the cont
34740 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54  ents of pRoot. T
34750 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69  hen install pChi
34760 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ld as the right-
34770 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f  child. */.  zero
34780 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69  Page(pRoot, pChi
34790 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
347a0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
347b0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
347c0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
347d0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
347e0 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64  ld);..  *ppChild
347f0 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74   = pChild;.  ret
34800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34810 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
34820 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
34830 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
34840 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
34850 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
34860 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
34870 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
34880 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
34890 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
348a0 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
348b0 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
348c0 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
348d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
348e0 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
348f0 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f  ne. Balancing ro
34900 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  utines are:.**.*
34910 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  *   balance_quic
34920 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  k().**   balance
34930 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62  _deeper().**   b
34940 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
34960 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
34970 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
34980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34990 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d  const int nMin =
349a0 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62   pCur->pBt->usab
349b0 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a  leSize * 2 / 3;.
349c0 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69    u8 aBalanceQui
349d0 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75  ckSpace[13];.  u
349e0 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20  8 *pFree = 0;.. 
349f0 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
34a00 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
34a10 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53  led = 0 );.  TES
34a20 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
34a30 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
34a40 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a   = 0 );..  do {.
34a50 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
34a60 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
34a70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
34a80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
34a90 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20  Page];..    if( 
34aa0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
34ab0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
34ac0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
34ad0 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
34ae0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
34af0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   is overfull. In
34b00 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20   this case call 
34b10 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  the.        ** b
34b20 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
34b30 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61  function to crea
34b40 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66  te a new child f
34b50 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
34b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
34b70 63 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74  copy the current
34b80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34b90 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74   root-page to it
34ba0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
34bb0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
34bc0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
34bd0 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
34be0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
34bf0 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
34c00 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
34c10 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b  _deeper_called++
34c20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
34c30 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
34c40 70 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72  per(pPage, &pCur
34c50 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20  ->apPage[1]);.  
34c60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34c80 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
34c90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
34ca0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
34cb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   0;.          pC
34cc0 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30  ur->aiIdx[1] = 0
34cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
34ce0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
34cf0 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  [1]->nOverflow )
34d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
34d30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
34d40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
34d50 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
34d60 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20  e<=nMin ){.     
34d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
34d80 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  e{.      MemPage
34d90 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74   * const pParent
34da0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
34db0 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20  iPage-1];.      
34dc0 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d  int const iIdx =
34dd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
34de0 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ge-1];..      rc
34df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34e00 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
34e10 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
34e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34e30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
34e40 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
34e50 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  NCE.        if( 
34e60 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20  pPage->hasData. 
34e70 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
34e80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20  ->nOverflow==1. 
34e90 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
34ea0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
34eb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20  pPage->nCell.   
34ec0 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74        && pParent
34ed0 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20  ->pgno!=1.      
34ee0 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e     && pParent->n
34ef0 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20  Cell==iIdx.     
34f00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
34f10 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  /* Call balance_
34f20 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74  quick() to creat
34f30 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  e a new sibling 
34f40 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63  of pPage on whic
34f50 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  h.          ** t
34f60 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72  o store the over
34f70 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e  flow cell. balan
34f80 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72  ce_quick() inser
34f90 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20  ts a new cell.  
34fa0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20          ** into 
34fb0 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
34fc0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
34fd0 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68   overflow. If th
34fe0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
34ff0 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78  happens, the nex
35000 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20  t interation of 
35010 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
35020 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74   balance pParent
35030 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75   .          ** u
35040 73 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63  se either balanc
35050 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62  e_nonroot() or b
35060 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e  alance_deeper().
35070 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20   Until this.    
35080 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
35090 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  , the overflow c
350a0 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ell is stored in
350b0 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
350c0 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  ckSpace[].      
350d0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a      ** buffer. .
350e0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
350f0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75         ** The pu
35100 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  rpose of the fol
35110 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
35120 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  is to check that
35130 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20   only a.        
35140 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c    ** single call
35150 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   to balance_quic
35160 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20  k() is made for 
35170 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  each call to thi
35180 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  s.          ** f
35190 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
351a0 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69   were not verifi
351b0 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67  ed, a subtle bug
351c0 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65   involving reuse
351d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
351e0 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
351f0 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20  ckSpace[] might 
35200 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20  sneak in..      
35210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
35220 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63   assert( (balanc
35230 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b  e_quick_called++
35240 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
35250 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71    rc = balance_q
35260 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50  uick(pParent, pP
35270 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69  age, aBalanceQui
35280 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  ckSpace);.      
35290 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
352a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
352b0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
352c0 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  se, call balance
352d0 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65  _nonroot() to re
352e0 64 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73  distribute cells
352f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
35300 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20  tween pPage and 
35310 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73  up to 2 of its s
35320 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68  ibling pages. Th
35330 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20  is involves.    
35340 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69        ** modifyi
35350 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
35360 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63  of pParent, whic
35370 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72  h may cause pPar
35380 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20  ent to.         
35390 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   ** become overf
353a0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
353b0 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  . The next itera
353c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
353d0 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  oop.          **
353e0 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
353f0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
35400 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20   correct this.. 
35410 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
35420 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
35430 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
35440 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
35450 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
35460 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20   or cells.      
35470 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65      ** are store
35480 64 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20  d in the pSpace 
35490 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
354a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c   immediately bel
354b0 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ow. .          *
354c0 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69  * A subsequent i
354d0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
354e0 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61  do-loop will dea
354f0 6c 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20  l with this by. 
35500 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c           ** call
35510 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  ing balance_nonr
35520 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64  oot() (balance_d
35530 65 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63  eeper() may be c
35540 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20  alled first,.   
35550 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74         ** but it
35560 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69   doesn't deal wi
35570 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  th overflow cell
35580 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74  s - just moves t
35590 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20  hem to a.       
355a0 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20     ** different 
355b0 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73  page). Once this
355c0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
355d0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
355e0 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20  oot() .         
355f0 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65   ** has complete
35600 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
35610 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70   release the pSp
35620 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20  ace buffer used 
35630 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
35640 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c  the previous cal
35650 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c  l, as the overfl
35660 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c  ow cell data wil
35670 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20  l have been .   
35680 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
35690 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
356a0 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62   body of a datab
356b0 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f  ase page or into
356c0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20   the new.       
356d0 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66     ** pSpace buf
356e0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  fer passed to th
356f0 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f  e latter call to
35700 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
35710 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ()..          */
35720 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70  .          u8 *p
35730 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
35740 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  ageMalloc(pCur->
35750 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
35760 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
35770 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
35780 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53  Parent, iIdx, pS
35790 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b  pace, iPage==1);
357a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
357b0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
357c0 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20      /* If pFree 
357d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
357e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53  points to the pS
357f0 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64  pace buffer used
35800 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
35810 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63   by a previous c
35820 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
35830 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f  onroot(). Its co
35840 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20  ntents are.     
35850 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74         ** now st
35860 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72  ored either on r
35870 65 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  eal database pag
35880 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65  es or within the
35890 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
358a0 20 6e 65 77 20 70 53 70 61 63 65 20 62 75 66 66   new pSpace buff
358b0 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65  er, so it may be
358c0 20 73 61 66 65 6c 79 20 66 72 65 65 64 20 68 65   safely freed he
358d0 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
358e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
358f0 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
35900 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
35910 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20    /* The pSpace 
35920 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66  buffer will be f
35930 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20 6e  reed after the n
35940 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ext call to.    
35950 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
35960 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a  _nonroot(), or j
35970 75 73 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  ust before this 
35980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
35990 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20 20 20  , whichever.    
359a0 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66        ** comes f
359b0 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  irst. */.       
359c0 20 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63     pFree = pSpac
359d0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
359e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
359f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
35a00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
35a10 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
35a20 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61  f the do-loop ba
35a30 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e  lances the paren
35a40 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
35a50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35a60 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge);.      pCur-
35a70 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >iPage--;.    }.
35a80 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
35a90 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
35aa0 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
35ab0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
35ac0 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
35ad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
35ae0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
35af0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
35b00 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
35b10 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
35b20 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
35b30 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
35b40 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
35b50 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
35b60 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
35b70 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
35b80 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
35b90 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
35ba0 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
35bb0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
35bc0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
35bd0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
35be0 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
35bf0 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
35c00 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
35c10 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
35c20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
35c30 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
35c40 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
35c50 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
35c60 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
35c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
35c80 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
35c90 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
35ca0 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66   then a successf
35cb0 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f  ul call to.** Mo
35cc0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
35cd0 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43  o seek cursor pC
35ce0 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65  ur to (pKey, nKe
35cf0 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  y) has already.*
35d00 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64  * been performed
35d10 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20  . seekResult is 
35d20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  the search resul
35d30 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65  t returned (a ne
35d40 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72  gative.** number
35d50 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
35d60 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
35d70 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
35d80 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f   (pKey, nKey), o
35d90 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20  r.** a positive 
35da0 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f  value if pCur po
35db0 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20  ints at an etry 
35dc0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
35dd0 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e  han .** (pKey, n
35de0 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Key)). .**.** If
35df0 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
35e00 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
35e10 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
35e20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
35e30 73 20 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72  s that.** cursor
35e40 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
35e50 67 20 61 74 20 74 68 65 20 65 78 69 73 74 69 6e  g at the existin
35e60 67 20 63 6f 70 79 20 6f 66 20 61 20 72 6f 77 20  g copy of a row 
35e70 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a  that is to be.**
35e80 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 49   overwritten.  I
35e90 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
35ea0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
35eb0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75   then cursor pCu
35ec0 72 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74  r may.** point t
35ed0 6f 20 61 6e 79 20 65 6e 74 72 79 20 6f 72 20 74  o any entry or t
35ee0 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c  o no entry at al
35ef0 6c 20 61 6e 64 20 73 6f 20 74 68 69 73 20 66 75  l and so this fu
35f00 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65  nction has to se
35f10 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  ek.** the cursor
35f20 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20   before the new 
35f30 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72  key can be inser
35f40 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
35f50 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
35f60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
35f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35f80 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
35f90 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
35fa0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
35fb0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
35fc0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
35fd0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
35fe0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
35ff0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
36000 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
36010 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
36020 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
36030 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
36040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36060 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
36070 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
36080 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
36090 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  dBias,          
360a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
360b0 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
360c0 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  an append */.  i
360d0 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20  nt seekResult   
360e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
360f0 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
36100 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28   MovetoUnpacked(
36110 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ) call */.){.  i
36120 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
36130 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20   = seekResult;  
36140 20 20 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62          /* -1: b
36150 65 66 6f 72 65 20 64 65 73 69 72 65 64 20 6c 6f  efore desired lo
36160 63 61 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65  cation  +1: afte
36170 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  r */.  int szNew
36180 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b   = 0;.  int idx;
36190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
361a0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
361b0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
361c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
361d0 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
361e0 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
361f0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
36200 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
36210 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
36220 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
36230 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
36240 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
36250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
36260 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
36270 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  kipNext;.  }..  
36280 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
36290 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
362a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
362b0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d  ->wrFlag && pBt-
362c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
362d0 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21  TRANS_WRITE && !
362e0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
362f0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
36300 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
36310 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ck(p, pCur->pgno
36320 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79  Root, pCur->pKey
36330 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a  Info!=0, 2) );..
36340 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
36350 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
36360 62 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e  been consistent.
36370 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   If this cursor 
36380 77 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20  was opened.  ** 
36390 65 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64  expecting an ind
363a0 65 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ex b-tree, then 
363b0 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
363c0 64 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62  d be inserting b
363d0 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69  lob.  ** keys wi
363e0 74 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64  th no associated
363f0 20 64 61 74 61 2e 20 49 66 20 74 68 65 20 63 75   data. If the cu
36400 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
36410 65 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a  expecting an.  *
36420 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  * intkey table, 
36430 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
36440 64 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69  d be inserting i
36450 6e 74 65 67 65 72 20 6b 65 79 73 20 77 69 74 68  nteger keys with
36460 20 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20   a.  ** blob of 
36470 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e  associated data.
36480 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
36490 70 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  pKey==0)==(pCur-
364a0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
364b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
364c0 73 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f  s an insert into
364d0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
364e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
364f0 69 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63  incrblob .  ** c
36500 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
36510 68 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70  he row being rep
36520 6c 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20  laced (assuming 
36530 74 68 69 73 20 69 73 20 61 20 72 65 70 6c 61 63  this is a replac
36540 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
36550 20 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c   - if it is not,
36560 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
36570 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a  s a no-op).  */.
36580 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79    if( pCur->pKey
36590 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Info==0 ){.    i
365a0 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
365b0 62 43 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79  bCursors(p, nKey
365c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
365d0 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
365e0 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
365f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
36600 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  this table..  **
36610 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61  .  ** In some ca
36620 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ses, the call to
36630 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62   btreeMoveto() b
36640 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  elow is a no-op.
36650 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c   For.  ** exampl
36660 65 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e  e, when insertin
36670 67 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61  g data into a ta
36680 62 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65  ble with auto-ge
36690 6e 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a  nerated integer.
366a0 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56    ** keys, the V
366b0 44 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65  DBE layer invoke
366c0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  s sqlite3BtreeLa
366d0 73 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  st() to figure o
366e0 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74  ut the .  ** int
366f0 65 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e  eger key to use.
36700 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
36710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
36720 61 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20  actually insert 
36730 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69  the .  ** data i
36740 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42  nto the intkey B
36750 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
36760 61 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  ase btreeMoveto(
36770 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a  ) recognizes.  *
36780 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
36790 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65  r is already whe
367a0 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  re it needs to b
367b0 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69  e and returns wi
367c0 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67  thout.  ** doing
367d0 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76   any work. To av
367e0 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68  oid thwarting th
367f0 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
36800 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  s, it is importa
36810 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63  nt.  ** not to c
36820 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 20  lear the cursor 
36830 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  here..  */.  rc 
36840 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
36850 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
36860 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69  Root, pCur);.  i
36870 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36880 63 3b 0a 20 20 69 66 28 20 21 6c 6f 63 20 29 7b  c;.  if( !loc ){
36890 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d  .    rc = btreeM
368a0 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
368b0 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
368c0 61 73 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69  as, &loc);.    i
368d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
368e0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
368f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
36900 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28  URSOR_VALID || (
36910 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
36920 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20  RSOR_INVALID && 
36930 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65  loc) );..  pPage
36940 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
36950 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
36960 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
36970 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
36980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36990 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
369a0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a  age->intKey );..
369b0 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
369c0 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
369d0 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
369e0 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
369f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
36a00 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
36a10 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
36a20 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
36a30 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
36a40 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
36a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36a60 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c  ->isInit );.  al
36a70 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
36a80 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  pBt);.  newCell 
36a90 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
36aa0 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
36ab0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
36ac0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
36ad0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
36ae0 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
36af0 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
36b00 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
36b10 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
36b20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
36b30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
36b40 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
36b50 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
36b60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
36b70 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
36b80 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  pBt) );.  idx = 
36b90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
36ba0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
36bb0 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31  loc==0 ){.    u1
36bc0 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  6 szOld;.    ass
36bd0 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e  ert( idx<pPage->
36be0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
36bf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36c00 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
36c10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
36c20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
36c30 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
36c40 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69      oldCell = fi
36c50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
36c60 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
36c70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
36c80 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
36c90 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
36ca0 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
36cb0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
36cc0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
36cd0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
36ce0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
36cf0 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
36d00 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
36d10 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
36d20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
36d30 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  sert;.  }else if
36d40 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
36d50 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
36d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36d70 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20  leaf );.    idx 
36d80 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
36d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
36da0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
36db0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
36dc0 3b 0a 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65  ;.  }.  insertCe
36dd0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e  ll(pPage, idx, n
36de0 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30  ewCell, szNew, 0
36df0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 61 73 73  , 0, &rc);.  ass
36e00 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36e10 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65  OK || pPage->nCe
36e20 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  ll>0 || pPage->n
36e30 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20  Overflow>0 );.. 
36e40 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20   /* If no error 
36e50 68 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20  has occured and 
36e60 70 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65  pPage has an ove
36e70 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c  rflow cell, call
36e80 20 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a   balance() .  **
36e90 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65   to redistribute
36ea0 20 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69   the cells withi
36eb0 6e 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63  n the tree. Sinc
36ec0 65 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20  e balance() may 
36ed0 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75  move.  ** the cu
36ee0 72 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42  rsor, zero the B
36ef0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69  tCursor.info.nSi
36f00 7a 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ze and BtCursor.
36f10 76 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76  validNKey.  ** v
36f20 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  ariables..  **. 
36f30 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72   ** Previous ver
36f40 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
36f50 63 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f  called moveToRoo
36f60 74 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  t() to move the 
36f70 63 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b  cursor.  ** back
36f80 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
36f90 65 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75  e as balance() u
36fa0 73 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  sed to invalidat
36fb0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
36fc0 20 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e   ** of BtCursor.
36fd0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43  apPage[] and BtC
36fe0 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49  ursor.aiIdx[]. I
36ff0 6e 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20  nstead of doing 
37000 74 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74  that,.  ** set t
37010 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
37020 74 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68  to "invalid". Th
37030 69 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20  is makes common 
37040 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
37050 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  s.  ** slightly 
37060 66 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  faster..  **.  *
37070 2a 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62  * There is a sub
37080 74 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e  tle but importan
37090 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68  t optimization h
370a0 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e  ere too. When in
370b0 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c  serting.  ** mul
370c0 74 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e  tiple records in
370d0 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74  to an intkey b-t
370e0 72 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ree using a sing
370f0 6c 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61  le cursor (as ca
37100 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68  n.  ** happen wh
37110 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ile processing a
37120 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e  n "INSERT INTO .
37130 2e 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65  .. SELECT" state
37140 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69  ment), it.  ** i
37150 73 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74  s advantageous t
37160 6f 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73  o leave the curs
37170 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
37180 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
37190 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
371a0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66   if possible. If
371b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
371c0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
371d0 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e  the last.  ** en
371e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
371f0 2c 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72  , and the next r
37200 6f 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20  ow inserted has 
37210 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20  an integer key. 
37220 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   ** larger than 
37230 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
37240 74 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20  ting key, it is 
37250 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65  possible to inse
37260 72 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20  rt the.  ** row 
37270 77 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20  without seeking 
37280 74 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73  the cursor. This
37290 20 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65   can be a big pe
372a0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
372b0 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e  .  */.  pCur->in
372c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
372d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
372e0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
372f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
37300 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
37310 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
37320 28 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  (pCur);..    /* 
37330 4d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e  Must make sure n
37340 4f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65  Overflow is rese
37350 74 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69  t to zero even i
37360 66 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a  f the balance().
37370 20 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e      ** fails. In
37380 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
37390 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
373a0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68   will result oth
373b0 65 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20  erwise. .    ** 
373c0 41 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75  Also, set the cu
373d0 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e  rsor state to in
373e0 76 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70  valid. This stop
373f0 73 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  s saveCursorPosi
37400 74 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72  tion().    ** fr
37410 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  om trying to sav
37420 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  e the current po
37430 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75  sition of the cu
37440 72 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43  rsor.  */.    pC
37450 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
37460 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
37470 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ow = 0;.    pCur
37480 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
37490 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20  R_INVALID;.  }. 
374a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
374b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
374c0 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  e]->nOverflow==0
374d0 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a   );..end_insert:
374e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
374f0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
37500 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
37510 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
37520 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
37530 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
37540 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62  ointing at a arb
37550 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  itrary location.
37560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
37570 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72  treeDelete(BtCur
37580 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
37590 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
375a0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
375b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
375c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
375d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
375e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
37600 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  code */.  MemPag
37610 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
37620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37630 2a 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65  * Page to delete
37640 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20   cell from */.  
37650 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
37660 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
37670 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
37680 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74  to cell to delet
37690 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  e */.  int iCell
376a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
376b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
376c0 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20  ndex of cell to 
376d0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
376e0 69 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20  iCellDepth;     
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64   /* Depth of nod
37710 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65  e containing pCe
37720 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74  ll */ ..  assert
37730 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
37740 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
37750 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
37760 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
37770 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
37780 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
37790 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
377a0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20  Cur->wrFlag );. 
377b0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
377c0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
377d0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
377e0 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ot, pCur->pKeyIn
377f0 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61  fo!=0, 2) );.  a
37800 73 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43  ssert( !hasReadC
37810 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72  onflicts(p, pCur
37820 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a  ->pgnoRoot) );..
37830 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
37840 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
37850 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61  age]>=pCur->apPa
37860 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
37870 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e  >nCell) .   || N
37880 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74  EVER(pCur->eStat
37890 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e!=CURSOR_VALID)
378a0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
378b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
378c0 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  /* Something has
378d0 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20   gone awry. */. 
378e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
378f0 20 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65   is a delete ope
37900 72 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65  ration to remove
37910 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61   a row from a ta
37920 62 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a  ble b-tree,.  **
37930 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
37940 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
37950 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77   open on the row
37960 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20   being deleted. 
37970 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
37980 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
37990 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
379a0 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
379b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c  pCur->info.nKey,
379c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c   0);.  }..  iCel
379d0 6c 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69  lDepth = pCur->i
379e0 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78  Page;.  iCellIdx
379f0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
37a00 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50  CellDepth];.  pP
37a10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
37a20 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  ge[iCellDepth];.
37a30 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
37a40 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
37a50 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  dx);..  /* If th
37a60 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
37a70 67 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64  g the entry to d
37a80 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c  elete is not a l
37a90 65 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20  eaf page, move. 
37aa0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74   ** the cursor t
37ab0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
37ac0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  try in the tree 
37ad0 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
37ae0 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e  than.  ** the en
37af0 74 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65  try being delete
37b00 64 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c  d. This cell wil
37b10 6c 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65  l replace the ce
37b20 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
37b30 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69  .  ** from the i
37b40 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68  nternal node. Th
37b50 65 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74  e 'previous' ent
37b60 72 79 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ry is used for t
37b70 68 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a  his instead.  **
37b80 20 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20 65   of the 'next' e
37b90 6e 74 72 79 2c 20 61 73 20 74 68 65 20 70 72 65  ntry, as the pre
37ba0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61  vious entry is a
37bb0 6c 77 61 79 73 20 61 20 70 61 72 74 20 6f 66 20  lways a part of 
37bc0 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65  the.  ** sub-tre
37bd0 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  e headed by the 
37be0 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68  child page of th
37bf0 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
37c00 65 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73  eted. This makes
37c10 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  .  ** balancing 
37c20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69  the tree followi
37c30 6e 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70  ng the delete op
37c40 65 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20  eration easier. 
37c50 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
37c60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
37c70 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 72  t notUsed;.    r
37c80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
37c90 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26  Previous(pCur, &
37ca0 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
37cb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37cc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  ;.  }..  /* Save
37cd0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
37ce0 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
37cf0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
37d00 20 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20   table before.  
37d10 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f  ** making any mo
37d20 64 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b  difications. Mak
37d30 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  e the page conta
37d40 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
37d50 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65  to be .  ** dele
37d60 74 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68  ted writable. Th
37d70 65 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72  en free any over
37d80 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
37d90 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a  iated with the .
37da0 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66    ** entry and f
37db0 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68  inally remove th
37dc0 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72  e cell itself fr
37dd0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  om within the pa
37de0 67 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ge.  .  */.  rc 
37df0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
37e00 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
37e10 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69  Root, pCur);.  i
37e20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37e30 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
37e40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
37e50 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
37e60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37e70 63 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43  c;.  rc = clearC
37e80 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
37e90 29 3b 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  );.  dropCell(pP
37ea0 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63  age, iCellIdx, c
37eb0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
37ec0 2c 20 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b 0a  , pCell), &rc);.
37ed0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37ee0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n rc;..  /* If t
37ef0 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
37f00 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20  was not located 
37f10 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  on a leaf page, 
37f20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
37f30 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c    ** is currentl
37f40 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
37f50 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
37f60 69 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  in the sub-tree 
37f70 68 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74  headed.  ** by t
37f80 68 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66  he child-page of
37f90 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77   the cell that w
37fa0 61 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  as just deleted 
37fb0 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c  from an internal
37fc0 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20  .  ** node. The 
37fd0 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65  cell from the le
37fe0 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f  af node needs to
37ff0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
38000 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
38010 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ode to replace t
38020 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e  he deleted cell.
38030 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
38040 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d  e->leaf ){.    M
38050 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20  emPage *pLeaf = 
38060 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
38070 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
38080 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67  nt nCell;.    Pg
38090 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50  no n = pCur->apP
380a0 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31  age[iCellDepth+1
380b0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73  ]->pgno;.    uns
380c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70  igned char *pTmp
380d0 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ;..    pCell = f
380e0 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70  indCell(pLeaf, p
380f0 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Leaf->nCell-1);.
38100 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c      nCell = cell
38110 53 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70  SizePtr(pLeaf, p
38120 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  Cell);.    asser
38130 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
38140 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a  pBt)>=nCell );..
38150 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
38160 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
38170 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70  pTmp = pBt->pTmp
38180 53 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d  Space;..    rc =
38190 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
381a0 74 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67  te(pLeaf->pDbPag
381b0 65 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65  e);.    insertCe
381c0 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
381d0 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65  dx, pCell-4, nCe
381e0 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 2c 20 26  ll+4, pTmp, n, &
381f0 72 63 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  rc);.    dropCel
38200 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e  l(pLeaf, pLeaf->
38210 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 2c 20  nCell-1, nCell, 
38220 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
38230 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
38240 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20  }..  /* Balance 
38250 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65  the tree. If the
38260 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77   entry deleted w
38270 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
38280 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20  leaf page,.  ** 
38290 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
382a0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  still points to 
382b0 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68  that page. In th
382c0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73  is case the firs
382d0 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  t.  ** call to b
382e0 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73  alance() repairs
382f0 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74   the tree, and t
38300 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69  he if(...) condi
38310 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76  tion is.  ** nev
38320 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  er true..  **.  
38330 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
38340 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
38350 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74  ed was on an int
38360 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c  ernal node page,
38370 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20   then.  ** pCur 
38380 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
38390 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  he leaf page fro
383a0 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77  m which a cell w
383b0 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20  as removed to.  
383c0 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ** replace the c
383d0 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ell deleted from
383e0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
383f0 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
38400 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79  htly.  ** tricky
38410 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   as the leaf nod
38420 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75  e may be underfu
38430 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ll, and the inte
38440 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20  rnal node may.  
38450 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64  ** be either und
38460 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20  er or overfull. 
38470 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e  In this case run
38480 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61   the balancing a
38490 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e  lgorithm.  ** on
384a0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66   t