/ Hex Artifact Content
Login

Artifact bc0393e5b9e3d182706315a308f84a6a4fa388dd:


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 0a 20 20  rn code */.  .  
9430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9440: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9450: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9470: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9480: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
94a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
94b0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
94c0: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
94d0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
94e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
94f0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9510: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
9530: 79 74 65 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  yte<pPage->pBt->
9540: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9550: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
9560: 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74  hdr+7];.  assert
9570: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
9580: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
9590: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
95a0: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
95b0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
95c0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
95d0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
95e0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
95f0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
9600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9610: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
9620: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9630: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9640: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9650: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9660: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9670: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9680: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9690: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
96a0: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
96b0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
96c0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
96d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
96e0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
96f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9700: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65  hdr+5]);.  }else
9710: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9720: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
9730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
9740: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
9750: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
9760: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
9770: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
9780: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
9790: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
97a0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
97b0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
97c0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
97d0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
97e0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
97f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
9800: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9810: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9830: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
9840: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
9850: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9860: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
9870: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
9880: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9890: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
98a0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
98b0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
98c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
98d0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
98e0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
98f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9900: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9910: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
9920: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
9930: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
9940: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
9950: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
9960: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
9970: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9980: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9990: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
99a0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
99b0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
99c0: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
99d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
99e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
99f0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9a00: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9a10: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
9a20: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
9a30: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
9a40: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
9a50: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
9a60: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
9a70: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9a80: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9aa0: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ae0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9af0: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9b00: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9b10: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
9b20: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
9b30: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
9b40: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
9b50: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9b60: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
9b70: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9b80: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9b90: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9ba0: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9bc0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9bd0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
9bf0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
9c00: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
9c10: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
9c20: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
9c30: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
9c40: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
9c50: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9c60: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
9c70: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
9c80: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
9c90: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
9ca0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
9cb0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
9cc0: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
9cd0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
9ce0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
9cf0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
9d00: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
9d10: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
9d20: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
9d30: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
9d40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
9d50: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
9d60: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
9d70: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9d80: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
9d90: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
9da0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9db0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
9dc0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
9dd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9de0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
9df0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
9e00: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
9e10: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
9e20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9e30: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9e40: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9e50: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9e60: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9e70: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9e80: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9e90: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9ea0: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9eb0: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9ec0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
9ed0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
9ee0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
9ef0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
9f00: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
9f10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9f20: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9f30: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9f40: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9f50: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9f80: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9f90: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9fa0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9fb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9fc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9fd0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9fe0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9ff0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a000: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a010: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
a020: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
a030: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
a040: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
a050: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
a060: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
a070: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a080: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a090: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a0a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
a0c0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
a0d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
a0e0: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
a0f0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
a100: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
a110: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
a120: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
a130: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
a140: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
a150: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
a160: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
a170: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
a180: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a190: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
a1a0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a1b0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a1c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a1d0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a1e0: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a1f0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a200: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a210: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a220: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a230: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a240: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a250: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a260: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a270: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a280: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a290: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a2a0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a2b0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a2c0: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a2d0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a2e0: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a2f0: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a300: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a310: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a320: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a330: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a340: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a350: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a360: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a370: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a380: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a390: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a3a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a3b0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a3c0: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a3d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a3e0: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a3f0: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a400: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a420: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a430: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a440: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a450: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a470: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a480: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a490: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a4a0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a4c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a4d0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a4e0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a4f0: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a500: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a510: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a520: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a530: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a540: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a550: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a560: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a570: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a580: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a590: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a5a0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a5b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a5c0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a5d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a5e0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a5f0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a600: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a610: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a630: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a650: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a660: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a670: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a680: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a690: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a6a0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a6b0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a6c0: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a6d0: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a6e0: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a6f0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a700: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a710: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a720: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a740: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a750: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a760: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a770: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a780: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a790: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a7a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a7b0: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a7c0: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a7d0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a7e0: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a7f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a800: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a810: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a820: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a840: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a850: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a860: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a870: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a880: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a890: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a8a0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a8b0: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a8c0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a8d0: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
a8e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a8f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a900: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a910: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a920: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a940: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a950: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a960: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a970: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a980: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a990: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a9a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a9b0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a9e0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a9f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
aa00: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
aa10: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
aa20: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
aa30: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
aa40: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
aa50: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
aa60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
aa70: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
aa80: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
aa90: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
aaa0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
aab0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
aac0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
aad0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
aae0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
aaf0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
ab00: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ab10: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ab20: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
ab30: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
ab40: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
ab50: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
ab60: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
ab70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ab80: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
ab90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
aba0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
abb0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
abc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
abd0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
abe0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
abf0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ac00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ac10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ac20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ac30: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ac40: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ac50: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ac60: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ac70: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ac80: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ac90: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
aca0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
acb0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
acc0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
acd0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
ace0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
acf0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ad00: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
ad10: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
ad20: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
ad30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ad40: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
ad50: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ad60: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
ad70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ad80: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ad90: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
ada0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
adb0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
adc0: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
add0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
ade0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
adf0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ae00: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
ae10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
ae20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ae30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
ae40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ae50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ae60: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
ae70: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
ae80: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
ae90: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
aea0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aeb0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
aec0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
aed0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
aee0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
aef0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
af00: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
af10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
af20: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
af30: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
af40: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
af50: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
af60: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
af70: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
af80: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
af90: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
afa0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
afb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
afc0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
afd0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
afe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
aff0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b000: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b010: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b020: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b030: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b040: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b050: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b070: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b090: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b0a0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b0b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b0c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b0d0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b0e0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
b0f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
b100: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
b110: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b120: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
b130: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
b140: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
b150: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
b160: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b170: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b180: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b190: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b1a0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b1b0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b1c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b1d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b1e0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b1f0: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
b200: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b210: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b220: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b230: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
b240: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b250: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b260: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b270: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b280: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
b290: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b2a0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b2b0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b2c0: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
b2d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b2e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b2f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b300: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b310: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b320: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b330: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b340: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b350: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b360: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b370: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b380: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b390: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b3a0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b3b0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b3c0: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b3d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b3e0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b3f0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b400: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b430: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b440: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b450: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
b460: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b470: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b480: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b490: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b4a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b4c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b4d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b4e0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b4f0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b500: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b510: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b520: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b530: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b540: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b550: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b560: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b570: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b580: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b590: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b5a0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b5b0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b5c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b5d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b5e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b5f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b600: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b610: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b620: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b630: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b640: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b650: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b660: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b670: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b680: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b690: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b6a0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b6b0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b6c0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b6d0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b6e0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
b6f0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
b700: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
b710: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
b720: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
b730: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
b740: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b750: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b760: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
b770: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
b780: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b790: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
b7a0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
b7b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
b7c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
b7d0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
b7e0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
b7f0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
b800: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
b810: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b820: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
b830: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
b840: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
b850: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
b860: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
b870: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
b880: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
b890: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
b8a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b8b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b8c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b8d0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
b8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b8f0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
b900: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
b910: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b920: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b930: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
b940: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
b950: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
b960: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
b970: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b980: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
b990: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b9a0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b9c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b9d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b9e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b9f0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ba00: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
ba10: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
ba20: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba30: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ba40: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ba50: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
ba60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ba70: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
ba80: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
ba90: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
baa0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bab0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bac0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bad0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bae0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
baf0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
bb00: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
bb10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bb20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bb50: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bb60: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bb70: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
bb80: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bb90: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
bba0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bbb0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bbc0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bbd0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bbe0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bbf0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bc00: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bc10: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bc20: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bc30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bc40: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bc50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bc80: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bc90: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bca0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bcb0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bcc0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bcd0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bce0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bcf0: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
bd00: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bd10: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
bd20: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bd30: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
bd40: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bd50: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
bd60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
bd70: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
bd80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
bd90: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
bda0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
bdb0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
bdc0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
bdd0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
bde0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
bdf0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
be00: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
be10: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
be20: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
be30: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
be40: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
be50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
be60: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
be70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be90: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
bea0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
beb0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
bec0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
bed0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
bee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bef0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bf00: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
bf10: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
bf20: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
bf30: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
bf40: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
bf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
bf60: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
bf70: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
bf80: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bf90: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bfa0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bfb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bfc0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bfd0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bfe0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
bff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c000: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c010: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c020: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c040: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c050: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c060: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c070: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c090: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c0a0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c0b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c0c0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c0d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c0f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c100: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  pBt->mutex) );.#
c110: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
c120: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 6d 65 6d  URE_DELETE.  mem
c130: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
c140: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
c150: 7a 65 20 2d 20 68 64 72 29 3b 0a 23 65 6e 64 69  ze - hdr);.#endi
c160: 66 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  f.  data[hdr] = 
c170: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
c180: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
c190: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
c1a0: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
c1b0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c1c0: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
c1d0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
c1e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c1f0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
c200: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
c210: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
c220: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c230: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
c240: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
c250: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
c260: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
c270: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
c280: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
c290: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
c2a0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
c2b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
c2c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
c2d0: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
c2e0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
c2f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
c300: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c310: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c320: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
c330: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
c340: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
c350: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
c360: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
c370: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
c380: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
c390: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c3a0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
c3b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
c3c0: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
c3d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
c3e0: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
c3f0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
c400: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c410: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c420: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c430: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c440: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c450: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c460: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c470: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c480: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c490: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c4a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c4b0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
c4c0: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
c4d0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c4e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
c4f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
c500: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
c510: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
c520: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
c530: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c540: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
c550: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
c560: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
c570: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
c580: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
c590: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
c5a0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
c5b0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
c5c0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
c5d0: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
c5e0: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
c5f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
c600: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
c610: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
c620: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
c630: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
c640: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
c650: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
c660: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
c670: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
c680: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
c690: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
c6a0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
c6b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
c6c0: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
c6d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
c6e0: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
c6f0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
c700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c710: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
c720: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
c730: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
c740: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
c750: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
c760: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
c770: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
c780: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
c790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
c7a0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
c7b0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
c7c0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
c7d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c7e0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c7f0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
c800: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
c810: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
c820: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
c830: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
c840: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
c850: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
c860: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
c870: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
c880: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
c890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c8a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
c8b0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
c8c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c8d0: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
c8e0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
c8f0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
c900: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
c910: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
c920: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c930: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c940: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c950: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
c960: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
c970: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
c980: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
c990: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
c9a0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
c9b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c9c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c9d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
c9e0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
c9f0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
ca00: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ca10: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
ca20: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
ca30: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
ca40: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ca50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ca60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ca70: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
ca80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ca90: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
caa0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
cab0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
cac0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
cad0: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
cae0: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
caf0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
cb00: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
cb10: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
cb20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
cb30: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
cb40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
cb50: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
cb60: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
cb70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
cb80: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
cb90: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
cba0: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
cbb0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cbc0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cbd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cbe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cbf0: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc00: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc10: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc20: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc30: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cc40: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cc50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cc60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
cc70: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cc80: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
cc90: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cca0: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
ccb0: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
ccc0: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
ccd0: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cce0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
ccf0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd00: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd10: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd20: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd30: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cd40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cd50: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cd60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cd70: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cd80: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cd90: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
cda0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45 53 54    int rc;.  TEST
cdb0: 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73 74  ONLY( Pgno iLast
cdc0: 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  Pg = pagerPageco
cdd0: 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20 61 73  unt(pBt); ).  as
cde0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cdf0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
ce00: 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  tex) );..  rc = 
ce10: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
ce20: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
ce30: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
ce40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ce50: 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
ce60: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
ce70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ce80: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
ce90: 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
cea0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ceb0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
cec0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77 61  d page number wa
ced0: 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 67 72  s either 0 or gr
cee0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
cef0: 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
cf00: 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  of the last page
cf10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
cf20: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
cf30: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
cf40: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
cf50: 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  T or some other 
cf60: 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c 49  error (i.e. SQLI
cf70: 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b 20  TE_FULL). Check 
cf80: 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
cf90: 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a 2f 0a  s the case.  */.
cfa0: 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f 3e    assert( (pgno>
cfb0: 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73 74  0 && pgno<=iLast
cfc0: 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  Pg) || rc!=SQLIT
cfd0: 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63 61  E_OK );.  testca
cfe0: 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
cff0: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d000: 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20 72  =iLastPg );..  r
d010: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d020: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d030: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d040: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d050: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d060: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d070: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d080: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d090: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d0a0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d0b0: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d0c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
d0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d0e0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
d0f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d100: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
d110: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
d120: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
d130: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d140: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d150: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
d160: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d170: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d180: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d190: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d1a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d1b0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
d1c0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
d1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
d1e0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
d1f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
d200: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
d210: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
d220: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
d230: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
d240: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d250: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
d260: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
d270: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
d280: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
d290: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d2a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d2b0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
d2c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
d2d0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
d2e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d2f0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
d300: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d310: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
d320: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
d330: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
d340: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
d350: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
d360: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d370: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d380: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
d390: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d3a0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d3b0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
d3c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d3e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d3f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d400: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
d410: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
d420: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
d430: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d440: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
d450: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
d460: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
d470: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
d480: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
d490: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
d4a0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
d4b0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
d4c0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
d4d0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
d4e0: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
d4f0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
d500: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
d510: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
d520: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
d530: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
d540: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
d550: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
d560: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
d570: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
d580: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
d590: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
d5a0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
d5b0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
d5c0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
d5d0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
d5e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
d5f0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
d600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
d610: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
d620: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
d630: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
d640: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
d650: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
d660: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
d670: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
d680: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
d690: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
d6a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d6b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d6c0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
d6d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
d6e0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
d6f0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
d700: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
d710: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
d720: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
d730: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
d740: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
d760: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d770: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
d780: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
d790: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
d7a0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
d7b0: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
d7c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
d7d0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
d7e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
d7f0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
d800: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
d810: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
d820: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
d830: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
d840: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
d850: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
d860: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
d870: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
d880: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d890: 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
d8a0: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
d8b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d8c0: 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
d8d0: 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
d8e0: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
d8f0: 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
d900: 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
d910: 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
d920: 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
d930: 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
d940: 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
d950: 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
d960: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d970: 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
d980: 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
d990: 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
d9a0: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
d9b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
d9c0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
d9d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
d9e0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d9f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
da00: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
da10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
da20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
da30: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
da40: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
da50: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
da60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
da70: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
da80: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
da90: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
daa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dab0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
dac0: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
dad0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
dae0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
daf0: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
db00: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71  pen() */.){.  sq
db10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db30: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
db40: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
db50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
db60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
db70: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
db80: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
db90: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
dba0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
dbc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
dbd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
dbe0: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
dbf0: 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
dc00: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
dc10: 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
dc20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dc30: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
dc40: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
dc50: 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
dc60: 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
dc70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dc80: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
dc90: 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
dca0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
dcb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
dcc0: 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
dcd0: 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
dce0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
dcf0: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
dd00: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
dd10: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
dd20: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
dd30: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
dd40: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
dd50: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d  tabase. This sym
dd60: 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  bol is only requ
dd70: 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74  ired if.  ** eit
dd80: 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65  her of the share
dd90: 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61  d-data or autova
dda0: 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72  cuum features ar
ddb0: 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a  e compiled .  **
ddc0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72   into the librar
ddd0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  y..  */.#if !def
dde0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ddf0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c  _SHARED_CACHE) |
de00: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
de10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
de20: 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  M).  #ifdef SQLI
de30: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
de40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
de50: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65  sMemdb = 0;.  #e
de60: 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
de70: 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c  t isMemdb = zFil
de80: 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70  ename && !strcmp
de90: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
dea0: 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69  mory:");.  #endi
deb0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  f.#endif..  asse
dec0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
ded0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dee0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
def0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20  tex) );..  pVfs 
df00: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20  = db->pVfs;.  p 
df10: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
df20: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
df30: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
df40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
df50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
df60: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
df70: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
df80: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
df90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
dfa0: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
dfb0: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
dfc0: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
dfd0: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
dfe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dff0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e000: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e010: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e020: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
e030: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
e040: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
e050: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
e060: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
e070: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
e080: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
e090: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
e0a0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
e0b0: 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d  b==0 && zFilenam
e0c0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
e0d0: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ] ){.    if( vfs
e0e0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e0f0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e100: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e110: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e120: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e130: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e140: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e150: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e160: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e170: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e180: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
e190: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e1a0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
e1b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e1c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e1d0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e1e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e1f0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
e210: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
e220: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
e230: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
e240: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e250: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
e260: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e270: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
e280: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
e290: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e2a0: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
e2b0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
e2c0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e2d0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e2e0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
e2f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e300: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
e310: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e320: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
e330: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
e340: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
e350: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
e360: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
e370: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
e380: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
e390: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
e3a0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
e3b0: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
e3c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
e3f0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
e400: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
e410: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
e420: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
e430: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
e440: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
e450: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
e460: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
e470: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
e480: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
e490: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
e4a0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e4c0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e4d0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e4f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e500: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e510: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e520: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
e530: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
e540: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e550: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
e560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e570: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
e580: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e5a0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
e5b0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
e5c0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
e5d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e5e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e5f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e600: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e620: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
e630: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
e640: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
e650: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
e660: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
e670: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
e680: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
e690: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
e6a0: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
e6b0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
e6c0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
e6d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
e6e0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
e6f0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
e700: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
e710: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e720: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
e730: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
e740: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
e750: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
e760: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e770: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
e780: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
e790: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
e7a0: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
e7b0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
e7c0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
e7d0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
e7e0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
e7f0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
e800: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
e810: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
e820: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
e830: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
e840: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
e850: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
e860: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
e870: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e880: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
e890: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
e8a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e8b0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
e8c0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
e8d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e8e0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
e8f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
e900: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
e910: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e920: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
e930: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
e940: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
e950: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
e960: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
e970: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e980: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e990: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
e9a0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
e9b0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e9c0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
e9d0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
e9e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
ea00: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
ea10: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
ea20: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
ea30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ea40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ea50: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
ea60: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
ea70: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
ea80: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
ea90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
eaa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
eab0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
eac0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
ead0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
eae0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
eaf0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
eb00: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
eb10: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
eb20: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
eb30: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
eb40: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
eb50: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
eb60: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
eb70: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
eb80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
eb90: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
eba0: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
ebb0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
ebc0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
ebd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
ebe0: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
ebf0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
ec00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
ec10: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
ec20: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
ec30: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
ec40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
ec50: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
ec60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ec80: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ec90: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
eca0: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
ecb0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
ecc0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
ecd0: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
ece0: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
ecf0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
ed00: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
ed10: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
ed20: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ed30: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
ed40: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
ed50: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
ed60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
ed70: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
ed80: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
ed90: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
eda0: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
edb0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
edc0: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
edd0: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
ede0: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
edf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
ee00: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
ee10: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
ee20: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ee30: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
ee40: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ee50: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
ee60: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ee70: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
ee80: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
ee90: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
eea0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
eeb0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
eec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eed0: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
eee0: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
eef0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ef00: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
ef10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ef20: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
ef30: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
ef40: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
ef50: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
ef60: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
ef70: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
ef80: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
ef90: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
efa0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
efb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
efc0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
efd0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
efe0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
eff0: 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
f000: 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
f010: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f020: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f030: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
f040: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
f050: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
f060: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
f070: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
f080: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
f090: 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
f0a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f0b0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f0c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f0d0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f0e0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
f0f0: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
f100: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
f110: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
f120: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
f130: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
f140: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
f150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
f160: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
f170: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
f180: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
f190: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
f1a0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f1b0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
f1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
f1d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
f1e0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
f1f0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
f200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
f210: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
f220: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f230: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
f240: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
f250: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
f260: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f270: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
f280: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
f290: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
f2a0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f2b0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
f2c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f2d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f2e0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
f2f0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
f300: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
f310: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f320: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
f330: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
f340: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f350: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
f360: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
f370: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f380: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
f3a0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f3b0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f3c0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f3d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f3e0: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
f3f0: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
f400: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
f410: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
f420: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
f430: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
f440: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
f450: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
f460: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
f470: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
f480: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
f490: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
f4a0: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
f4b0: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
f4c0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
f4d0: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
f4e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f4f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f500: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
f510: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
f520: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
f530: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
f540: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
f550: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
f560: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
f570: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
f580: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
f590: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
f5a0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
f5b0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
f5c0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f5d0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
f5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f5f0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
f600: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
f610: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
f620: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
f630: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
f640: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
f650: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
f660: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
f670: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
f680: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
f690: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
f6a0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
f6b0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
f6c0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
f6d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
f6e0: 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
f6f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f720: 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
f730: 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
f740: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
f750: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
f760: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
f770: 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
f780: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
f790: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
f7a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
f7b0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
f7c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
f7d0: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
f7e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  ;.  }.  if( mute
f7f0: 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
f800: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f810: 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
f820: 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
f830: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f840: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
f850: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f860: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
f870: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
f880: 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
f890: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
f8a0: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
f8b0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
f8c0: 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
f8d0: 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
f8e0: 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
f8f0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
f900: 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
f910: 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
f920: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
f930: 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
f940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
f950: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
f960: 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
f970: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f980: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f990: 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
f9a0: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
f9b0: 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
f9c0: 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
f9d0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
f9e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
f9f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
fa00: 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
fa10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
fa20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
fa30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
fa40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fa50: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
fa60: 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
fa70: 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
fa80: 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
fa90: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
faa0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fab0: 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
fac0: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
fad0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fae0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
faf0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
fb00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
fb10: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
fb20: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fb30: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
fb40: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
fb50: 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
fb60: 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
fb70: 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
fb80: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
fb90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
fba0: 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
fbb0: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
fbc0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
fbd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fbe0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
fbf0: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
fc00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
fc10: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
fc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
fc30: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
fc40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fc50: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
fc60: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
fc70: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
fc80: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
fc90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
fca0: 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
fcb0: 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
fcc0: 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
fcd0: 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
fce0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fcf0: 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
fd00: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fd10: 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
fd20: 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
fd30: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
fd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
fd50: 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
fd60: 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
fd70: 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
fd80: 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
fd90: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
fda0: 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
fdb0: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
fdc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
fdd0: 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
fde0: 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
fdf0: 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
fe00: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
fe10: 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
fe20: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
fe30: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
fe40: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
fe50: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
fe60: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fe70: 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
fe80: 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
fe90: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
fea0: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
feb0: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
fec0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fed0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
fee0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
fef0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ff00: 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
ff10: 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
ff20: 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
ff30: 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
ff40: 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
ff50: 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
ff60: 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
ff70: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
ff80: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ff90: 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
ffa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
ffb0: 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
ffc0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
ffd0: 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
ffe0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
fff0: 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10000 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10010 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10020 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10030 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10040 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10050 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10060 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10070 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10080 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10090 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
100a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
100b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
100c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
100d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
100e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
100f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
10100 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
10110 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
10120 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
10130 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10140 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10150 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10160 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10170 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10180 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10190 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
101a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
101b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
101c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
101d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
101e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
101f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10200 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10210 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10220 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10240 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10250 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10260 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10270 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10280 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10290 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
102a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
102b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
102c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
102d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
102e0 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ee(pBt->pSchema)
102f0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
10300 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
10310 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
10320 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
10330 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10340 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
10350 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
10360 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
10370 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10380 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
10390 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
103a0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
103b0 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
103c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
103d0 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
103e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
103f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
10400 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10410 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
10420 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
10430 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64  of pages allowed
10440 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
10450 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
10460 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
10470 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f   pages is set to
10480 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a   the absolute.**
10490 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
104a0 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  .  If mxPage is 
104b0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61  negative, the pa
104c0 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72  ger will.** oper
104d0 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73  ate asynchronous
104e0 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74  ly - it will not
104f0 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e   stop to do fsyn
10500 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72  c()s.** to insur
10510 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  e data is writte
10520 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  n to the disk su
10530 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20  rface before.** 
10540 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61  continuing.  Tra
10550 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
10560 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e  work if synchron
10570 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61  ous is off,.** a
10580 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
10590 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  cannot be corrup
105a0 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67  ted if this prog
105b0 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20  ram.** crashes. 
105c0 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72   But if the oper
105d0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61  ating system cra
105e0 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73  shes or there is
105f0 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f  .** an abrupt po
10600 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e  wer failure when
10610 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10620 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73  off, the databas
10630 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65  e.** could be le
10640 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
10650 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f  stent and unreco
10660 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a  verable state..*
10670 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  * Synchronous is
10680 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73   on by default s
10690 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
106a0 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  ption is not.** 
106b0 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79  normally a worry
106c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
106d0 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
106e0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
106f0 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
10700 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
10710 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
10720 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10730 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
10740 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10750 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
10760 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
10770 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
10780 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
10790 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
107a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
107b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
107c0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
107d0 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
107e0 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
107f0 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
10800 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
10810 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
10820 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
10830 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
10840 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
10850 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
10860 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
10870 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
10880 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
10890 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
108a0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
108b0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
108c0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
108d0 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
108e0 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
108f0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
10900 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
10910 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
10920 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
10930 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
10940 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
10950 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
10960 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
10970 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
10980 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
10990 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
109a0 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65  ite3BtreeSetSafe
109b0 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70  tyLevel(Btree *p
109c0 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
109d0 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74   fullSync){.  Bt
109e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
109f0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
10a00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10a10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
10a20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10a30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
10a40 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
10a50 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50  etyLevel(pBt->pP
10a60 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c  ager, level, ful
10a70 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  lSync);.  sqlite
10a80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10aa0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
10ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10ac0 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
10ad0 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
10ae0 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
10af0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
10b00 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
10b10 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
10b20 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
10b30 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
10b40 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
10b50 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
10b60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10b70 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
10b80 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
10b90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10ba0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
10bb0 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65    .  sqlite3Btre
10bc0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
10bd0 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
10be0 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20  >pPager );.  rc 
10bf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  = sqlite3PagerNo
10c00 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
10c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10c20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10c30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
10c40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10c50 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
10c60 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
10c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
10c80 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  M)./*.** Change 
10c90 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
10ca0 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
10cb0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
10cc0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
10cd0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
10ce0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
10cf0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
10d00 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10d10 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
10d20 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
10d30 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
10d40 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
10d50 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
10d60 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
10d70 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
10d80 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
10d90 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
10da0 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
10db0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
10dc0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
10dd0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
10de0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
10df0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
10e00 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
10e10 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
10e20 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
10e30 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
10e40 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
10e50 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
10e60 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
10e70 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
10e80 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
10e90 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
10ea0 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
10eb0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
10ec0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
10ed0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
10ee0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
10ef0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
10f00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
10f10 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
10f20 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
10f30 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
10f40 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
10f50 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a  then the pageSiz
10f60 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73  eFixed flag is s
10f70 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
10f80 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
10f90 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
10fa0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
10fb0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
10fc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
10fd0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
10fe0 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
10ff0 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
11000 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
11010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11020 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11030 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11040 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
11050 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
11060 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
11070 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
11080 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
11090 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  Fixed ){.    sql
110a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
110b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
110c0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
110d0 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
110e0 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
110f0 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
11100 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
11110 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
11120 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
11130 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
11140 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
11150 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
11160 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
11170 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
11180 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
11190 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
111a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
111b0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
111c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
111d0 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
111e0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
111f0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
11200 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
11210 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
11220 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
11230 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11240 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
11250 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
11260 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
11270 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
11280 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
11290 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
112a0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
112b0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67   iFix ) pBt->pag
112c0 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
112d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
112e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
112f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11300 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
11310 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
11320 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
11330 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
11340 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
11350 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
11360 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
11370 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11380 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
11390 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
113a0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
113b0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
113c0 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
113d0 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
113e0 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
113f0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
11400 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
11410 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
11420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11430 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
11440 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
11450 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11460 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
11470 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
11480 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
11490 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
114a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
114b0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
114c0 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
114d0 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
114e0 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
114f0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
11500 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
11510 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
11520 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
11530 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
11540 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
11550 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
11560 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
11570 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
11580 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
11590 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
115a0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
115b0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
115c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
115d0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
115e0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
115f0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
11600 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
11610 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11620 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
11630 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
11640 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
11650 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
11660 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11670 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
11680 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11690 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
116a0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
116b0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
116c0 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
116d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
116e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
116f0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
11700 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
11710 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
11720 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
11730 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
11740 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
11750 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
11760 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
11770 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
11780 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
11790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
117a0 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
117b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
117c0 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
117d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
117e0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
117f0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
11800 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
11810 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11820 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
11840 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
11850 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
11860 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
11870 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
11880 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30  ixed && (av ?1:0
11890 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
118a0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
118b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
118c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
118d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
118e0 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
118f0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
11900 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
11910 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11920 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11930 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
11940 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
11950 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
11960 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
11970 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
11980 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
11990 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
119a0 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
119b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
119c0 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
119d0 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
119e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
119f0 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
11a00 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11a10 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
11a20 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
11a30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11a40 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
11a50 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
11a60 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
11a70 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
11a80 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
11a90 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
11aa0 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
11ab0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
11ac0 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
11ad0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11ae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
11af0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
11b00 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
11b10 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
11b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
11b30 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
11b40 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
11b50 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
11b60 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
11b70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
11b80 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
11b90 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
11ba0 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
11bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
11bc0 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
11bd0 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
11be0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
11bf0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
11c00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
11c10 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
11c20 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
11c30 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
11c40 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
11c50 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
11c60 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
11c70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Bt){.  int rc;. 
11c80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
11c90 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
11ca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11cb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11cc0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11cd0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
11ce0 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
11cf0 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
11d00 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
11d10 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
11d20 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
11d30 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
11d40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
11d50 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
11d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11d70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
11d80 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
11d90 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
11da0 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
11db0 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
11dc0 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
11dd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
11de0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
11df0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
11e00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
11e10 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
11e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e30 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11e40 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
11e50 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
11e60 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
11e70 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
11e80 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
11e90 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
11ea0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
11eb0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
11ec0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
11ed0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
11ee0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
11ef0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11f00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11f10 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
11f20 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
11f30 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
11f40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
11f50 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
11f60 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11f70 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11f80 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
11f90 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
11fa0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
11fb0 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
11fc0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
11fd0 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
11fe0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
11ff0 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
12000 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
12010 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
12020 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
12030 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
12040 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
12050 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
12060 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
12070 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
12080 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
12090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
120a0 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
120b0 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
120c0 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
120d0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
120e0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
120f0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
12100 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
12110 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
12120 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
12130 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
12140 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
12150 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
12160 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
12170 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
12180 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
12190 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
121a0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
121b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
121c0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
121d0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
121e0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
121f0 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
12200 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
12210 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
12220 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
12230 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
12240 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
12250 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
12260 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
12270 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
12280 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
12290 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
122a0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
122b0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
122c0 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
122d0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
122e0 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
122f0 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
12300 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
12310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12320 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
12330 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
12340 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
12350 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
12360 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
12370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12380 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
12390 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
123a0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
123b0 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  6)usableSize;.  
123c0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
123d0 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
123e0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
123f0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
12400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12410 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
12420 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
12430 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
12470 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
12480 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12490 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
124a0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
124b0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
124c0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
124d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
124e0 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
124f0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12500 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
12510 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
12520 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12530 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
12540 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
12550 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
12560 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
12570 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
12580 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
12590 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
125a0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
125b0 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
125c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
125d0 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
125e0 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
125f0 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
12600 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
12610 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
12620 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
12630 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
12640 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
12650 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
12660 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
12670 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
12680 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
12690 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
126a0 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
126b0 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
126c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
126d0 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
126e0 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
126f0 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
12700 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
12710 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
12720 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
12730 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
12740 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
12750 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
12760 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
12770 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
12780 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
12790 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
127a0 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
127b0 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
127c0 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
127d0 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
127e0 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
127f0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
12800 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
12810 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
12820 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b  12)*64/255 - 23;
12830 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
12840 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
12850 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
12860 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c   23;.  pBt->maxL
12870 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eaf = pBt->usabl
12880 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42  eSize - 35;.  pB
12890 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42  t->minLeaf = (pB
128a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
128b0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
128c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
128d0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
128e0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
128f0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
12900 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
12910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
12920 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12930 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
12940 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
12950 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
12960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12970 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
12980 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
12990 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
129a0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
129b0 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
129c0 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
129d0 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
129e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
129f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
12a00 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
12a10 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
12a20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12a30 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
12a40 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
12a50 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
12a60 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
12a70 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
12a80 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
12a90 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
12aa0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12ab0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
12ac0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
12ad0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
12ae0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12af0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12b00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12b10 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
12b20 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  or==0 || pBt->in
12b30 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
12b40 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
12b50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12b60 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
12b70 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
12b80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12b90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
12ba0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
12bb0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
12bc0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
12bd0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  er)==1 );.    as
12be0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
12bf0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
12c00 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
12c10 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42  >pPage1);.    pB
12c20 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
12c30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
12c40 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
12c50 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
12c60 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
12c70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
12c80 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
12c90 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
12ca0 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
12cb0 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
12cc0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
12cd0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
12ce0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12cf0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
12d00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
12d10 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
12d20 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
12d30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12d40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12d50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12d70 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12d80 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
12d90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12da0 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
12db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12dc0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
12dd0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
12de0 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
12df0 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
12e00 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
12e10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
12e20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
12e30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12e40 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
12e50 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
12e60 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12e70 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
12e80 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12e90 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
12ea0 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
12eb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
12ec0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
12ed0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
12ee0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12ef0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
12f00 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
12f10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
12f20 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
12f30 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
12f40 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
12f50 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
12f60 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
12f70 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
12f80 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
12f90 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
12fa0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
12fb0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
12fc0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
12fd0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
12fe0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
12ff0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
13000 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
13010 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13020 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
13030 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
13040 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
13050 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
13060 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
13070 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
13080 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
13090 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
130a0 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
130b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
130c0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
130d0 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
130e0 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
130f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
13100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13110 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
13120 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
13130 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
13140 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13150 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
13160 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13170 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
13180 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
13190 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
131a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
131b0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
131c0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
131d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
131e0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
131f0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
13200 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
13210 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13220 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13230 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13240 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
13250 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
13260 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
13270 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
13280 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
13290 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
132a0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
132b0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
132c0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
132d0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
132e0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
132f0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13300 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
13310 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13320 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13330 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13340 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
13350 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
13360 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13370 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
13380 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
13390 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
133a0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
133b0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
133c0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
133d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
133e0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
133f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
13400 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
13410 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13420 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13430 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13440 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13450 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13460 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13470 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
13480 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
13490 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
134a0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
134b0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
134c0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
134d0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
134e0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
134f0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
13500 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
13510 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13520 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13530 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13540 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13550 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13560 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13570 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
13580 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
13590 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
135a0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
135b0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
135c0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
135d0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
135e0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
135f0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
13600 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
13610 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13620 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13630 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13640 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13650 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13660 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13670 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
13680 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
13690 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
136a0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
136b0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
136c0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
136d0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
136e0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
136f0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
13700 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
13710 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13720 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13730 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13740 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13750 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13760 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13770 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
13780 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
13790 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
137a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
137b0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
137c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
137d0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
137e0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
137f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13800 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
13810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13820 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13830 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13840 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13850 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13860 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13870 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
13880 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
13890 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
138a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
138b0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
138c0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
138d0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
138e0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
138f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13900 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13910 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13920 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13930 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13940 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13950 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13960 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13970 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13980 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13990 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
139a0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
139b0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
139c0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
139d0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
139e0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
139f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13a00 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13a10 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13a20 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13a30 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13a40 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13a50 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13a60 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13a70 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13a80 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
13a90 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
13aa0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13ab0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13ac0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13ad0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13ae0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13af0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13b00 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13b10 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13b20 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13b30 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13b40 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13b50 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13b60 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13b70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13b80 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13b90 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13ba0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13bb0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13bc0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13be0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13bf0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13c00 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13c10 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13c20 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13c30 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13c40 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13c50 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13c60 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13c70 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13c80 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13ca0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13cb0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13cc0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13cd0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13ce0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13cf0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13d00 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13d10 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13d20 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13d30 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13d40 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13d50 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13d60 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13d70 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13d80 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13d90 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64  rans_begun;..  d
13da0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
13db0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
13dc0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
13dd0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
13de0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
13df0 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
13e00 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13e10 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
13e20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
13e30 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
13e40 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
13e50 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
13e60 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
13e70 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
13e80 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
13e90 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
13ea0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
13eb0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
13ec0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
13ed0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
13ee0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
13ef0 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
13f00 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
13f10 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
13f20 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
13f30 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
13f40 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
13f50 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
13f60 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
13f70 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
13f80 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
13f90 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
13fa0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
13fb0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
13fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13fd0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
13fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14000 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
14010 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
14020 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
14030 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
14040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14060 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
14070 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
14080 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14090 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
140a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
140b0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
140c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
140d0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
140e0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
140f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14100 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
14110 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
14120 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14130 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
14140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14150 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
14160 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
14170 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
14180 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
14190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
141a0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
141b0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
141c0 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
141d0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
141e0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
141f0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
14200 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
14210 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
14220 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14230 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14240 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
14250 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
14260 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
14270 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
14280 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
14290 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
142a0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
142b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
142c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
142d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
142e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
142f0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
14300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14310 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14320 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14330 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14340 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
14350 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
14360 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
14370 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
14380 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
14390 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
143a0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
143b0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
143c0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
143d0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
143e0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
143f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
14400 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
14410 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14420 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14430 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14440 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
14450 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
14460 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
14470 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
14480 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
14490 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
144a0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
144b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144c0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
144d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
144e0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
144f0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
14500 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14510 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14520 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14530 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14550 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
14560 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
14570 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
14580 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
14590 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
145a0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
145b0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
145c0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
145d0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
145e0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
145f0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
14600 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
14610 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14620 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14630 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14640 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
14670 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
14680 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
146b0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
146c0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
146d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14710 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14720 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14730 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14740 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
14750 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
14760 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14770 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14780 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14790 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
147a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
147b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
147c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
147d0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
147e0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
147f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
14810 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14820 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14830 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14840 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
14850 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14860 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
14870 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14880 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14890 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
148a0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
148b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
148c0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
148d0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
148e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
148f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14900 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14910 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14920 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14930 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14940 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
14950 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
14960 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
14970 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
14980 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
14990 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
149a0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
149b0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
149c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
149d0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
149e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
149f0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
14a00 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
14a10 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
14a20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
14a30 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
14a40 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
14a50 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
14a60 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
14a70 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
14a80 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
14a90 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
14aa0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14ab0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14ac0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
14af0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14b00 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
14b10 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14b20 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14b30 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
14b40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14b50 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
14b60 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
14b70 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
14b80 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
14b90 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
14ba0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
14bb0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14bc0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
14bd0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
14be0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
14bf0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
14c00 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
14c10 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
14c20 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
14c30 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
14c40 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
14c50 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
14c60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14c70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14c80 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14c90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
14ca0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
14cb0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
14cc0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14cd0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
14ce0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
14cf0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
14d00 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14d10 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
14d20 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
14d30 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
14d40 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
14d50 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
14d60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14d70 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
14d80 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
14d90 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
14da0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
14db0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
14dc0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
14dd0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
14de0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
14df0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14e00 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
14e10 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
14e20 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
14e30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
14e40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14e50 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
14e60 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14e70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
14e80 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
14e90 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
14ea0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
14eb0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
14ec0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
14ed0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
14ee0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
14ef0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
14f00 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14f10 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
14f20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
14f30 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14f40 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
14f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f90 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
14fa0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
14fb0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14fc0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
14fd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14ff0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
15000 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
15010 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
15020 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
15030 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
15040 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
15050 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
15060 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
15070 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15080 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
15090 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
150a0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
150b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
150c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
150d0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
150e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
150f0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
15100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15110 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
15120 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15130 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15140 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15150 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15160 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15170 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
15180 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
15190 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
151a0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
151b0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
151c0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
151d0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
151e0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
151f0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
15200 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
15210 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15220 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15230 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15240 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15250 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15260 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15270 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
15280 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
15290 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
152a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
152b0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
152c0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
152d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
152e0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
152f0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
15300 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15310 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15320 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15330 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15340 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15350 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15360 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15370 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15380 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
15390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
153a0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
153b0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
153c0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
153d0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
153e0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
153f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
15400 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
15410 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15420 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15430 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15440 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
15450 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
15460 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
15470 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
15480 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
15490 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
154a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
154b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
154c0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
154d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
154e0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
154f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15500 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15510 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15520 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15530 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
15550 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
15560 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
15570 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
15580 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
15590 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
155a0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
155b0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
155c0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
155d0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
155e0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
155f0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
15600 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
15610 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15620 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15630 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15640 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15650 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15660 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15670 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
15680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
156a0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
156b0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
156c0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
156d0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
156e0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
156f0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15700 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15710 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15720 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15730 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15740 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15750 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15760 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
15780 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
15790 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
157a0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
157b0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
157c0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
157d0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
157e0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
157f0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15800 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15810 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15820 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15830 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15840 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15850 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15860 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15870 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15880 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
15890 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
158a0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
158b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
158c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
158d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
158e0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
158f0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15900 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15910 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15920 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
15930 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15940 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
15950 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
15960 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
15970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
159a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
159b0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
159c0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
159d0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
159e0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
159f0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15a00 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15a10 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15a20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
15a30 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15a40 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
15a50 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
15a60 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15a70 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
15a80 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
15a90 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
15aa0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15ac0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15ad0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15ae0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15af0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
15b00 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15b30 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
15b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15b50 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
15b60 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
15b70 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
15b80 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
15b90 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
15ba0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
15bb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
15bd0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
15be0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
15bf0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
15c00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15c10 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15c20 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
15c30 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
15c40 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
15c50 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
15c60 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
15c70 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
15c80 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
15c90 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
15ca0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
15cb0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
15cc0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
15cd0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15cf0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
15d00 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
15d10 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
15d20 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
15d30 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
15d40 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
15d50 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
15d60 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
15d70 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
15d80 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
15d90 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
15da0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
15db0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
15dc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
15dd0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
15de0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
15df0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
15e00 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
15e10 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
15e20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
15e30 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
15e40 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
15e50 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
15e60 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
15e70 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
15e80 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
15e90 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
15ea0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
15eb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15ed0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
15ee0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
15ef0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
15f00 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
15f10 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
15f20 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
15f30 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
15f40 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
15f50 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
15f60 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
15f70 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
15f80 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
15f90 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
15fa0 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
15fb0 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
15fc0 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
15fd0 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
15fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
15ff0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
16000 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
16010 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
16020 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
16030 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
16040 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16050 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
16060 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
16070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16080 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
16090 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
160a0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
160b0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
160c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
160d0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
160e0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
160f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16100 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
16110 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
16120 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
16130 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
16140 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16150 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16160 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
16170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
16180 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
16190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
161a0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
161b0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
161c0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
161d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
161f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16200 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16210 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16230 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16250 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
16260 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
16270 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
16280 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
16290 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
162a0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
162b0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
162c0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
162d0 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
162e0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
162f0 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
16300 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
16310 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
16320 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
16330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16340 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
16350 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
16360 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
16370 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
16380 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
16390 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
163a0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
163b0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
163c0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
163d0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
163e0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
163f0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
16400 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
16410 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16440 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16460 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
16470 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
16480 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
16490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
164a0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
164b0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
164c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
164d0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
164e0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
164f0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
16500 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
16510 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16520 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16530 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
16540 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16560 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16570 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
16580 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
16590 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
165a0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
165b0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
165c0 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
165d0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
165e0 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
165f0 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
16600 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
16610 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
16620 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
16630 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16640 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
16650 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
16660 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
16670 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
16680 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
16690 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
166a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
166b0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
166c0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
166d0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
166e0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
166f0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
16700 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16710 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
16720 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16740 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
16750 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
16760 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16770 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
16780 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
16790 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
167a0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
167b0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
167c0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
167d0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
167e0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
167f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16800 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
16810 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
16820 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16840 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
16850 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
16860 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
16870 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
16880 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
16890 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
168a0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
168b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
168c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
168d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
168e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
168f0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
16900 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
16910 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
16920 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16930 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
16940 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16950 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
16960 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
16970 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
16980 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
16990 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  pPg;.        int
169a0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
169b0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
169c0 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
169d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
169e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
169f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16a10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16a20 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
16a30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
16a40 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
16a50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16a90 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   }.      iLastPg
16aa0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  --;.    }.    sq
16ab0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
16ac0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
16ad0 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20  ger, iLastPg);. 
16ae0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16af0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16b00 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
16b10 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
16b20 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
16b30 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
16b40 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
16b50 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
16b60 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
16b70 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16b80 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
16b90 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
16ba0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
16bb0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16bc0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
16bd0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16be0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
16bf0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
16c00 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
16c10 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
16c20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16c30 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
16c40 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16c50 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
16c60 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
16c70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16c80 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16c90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16ca0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16cb0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
16cc0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16cd0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16ce0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
16cf0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
16d00 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
16d10 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
16d20 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
16d30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16d40 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16d50 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16d60 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
16d70 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70  umStep(pBt, 0, p
16d80 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
16d90 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
16da0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16db0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16dc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16dd0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
16de0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
16df0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
16e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
16e10 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
16e20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
16e30 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
16e40 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
16e50 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
16e60 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
16e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16e80 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
16e90 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
16ea0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
16eb0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
16ec0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
16ed0 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
16ee0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
16ef0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
16f00 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
16f10 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
16f20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
16f30 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
16f40 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
16f50 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
16f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16f70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16f80 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
16f90 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
16fa0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
16fb0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
16fc0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
16fd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16fe0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16ff0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
17000 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
17010 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
17020 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17030 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
17040 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
17050 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
17060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17070 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
17080 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
17090 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
170a0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
170b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
170c0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
170d0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
170e0 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
170f0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
17100 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
17110 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
17120 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
17130 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
17140 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
17150 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
17160 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
17170 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
17180 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
17190 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
171a0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
171b0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
171c0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
171d0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
171e0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
171f0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
17200 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17210 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
17220 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17230 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
17240 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
17250 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
17260 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
17270 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
17280 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
17290 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
172a0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
172b0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
172c0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
172d0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
172e0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
172f0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
17300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
17310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17320 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
17330 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
17340 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17350 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17360 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
17370 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
17380 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
17390 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
173a0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
173b0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
173c0 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
173d0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
173e0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
173f0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
17400 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
17410 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
17420 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17430 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
17440 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
17450 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
17460 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
17470 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
17480 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
17490 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
174a0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
174b0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
174c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
174d0 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
174e0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
174f0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
17500 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
17510 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
17520 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
17530 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
17540 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
17550 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
17560 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
17570 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
17580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
175a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
175b0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
175c0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
175d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
175e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
175f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17600 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
17610 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
17620 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
17630 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
17640 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
17650 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17670 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
17680 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
17690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
176a0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
176b0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
176c0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
176d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
176e0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
176f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17700 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
17710 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17720 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
17730 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
17740 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
17750 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
17760 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
17770 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
17780 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
17790 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
177a0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
177b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
177c0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
177d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
177e0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
177f0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
17800 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
17810 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
17820 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
17830 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
17840 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
17850 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
17860 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
17870 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
17890 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
178a0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
178b0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
178c0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
178d0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
178e0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
178f0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
17900 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17910 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
17920 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
17930 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
17940 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
17950 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
17960 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
17970 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
17980 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
17990 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
179a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
179b0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
179c0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
179d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
179e0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
179f0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
17a00 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
17a10 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
17a20 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
17a30 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
17a40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
17a50 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
17a60 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
17a70 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
17a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
17a90 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
17aa0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
17ab0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
17ac0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17ad0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
17ae0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
17af0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
17b00 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
17b10 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
17b20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
17b30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17b40 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
17b50 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
17b60 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
17b70 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
17b80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17b90 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
17ba0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
17bb0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
17bc0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
17bd0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
17be0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
17bf0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
17c00 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
17c10 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
17c20 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
17c30 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
17c40 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
17c50 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
17c60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
17c70 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
17c80 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
17c90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17ca0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
17cb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
17cc0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
17cd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17ce0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
17cf0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
17d00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17d10 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
17d20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17d30 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
17d40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17d50 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
17d60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17d70 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
17d80 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
17d90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17db0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17dc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
17dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17de0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
17df0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e00 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
17e10 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
17e20 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
17e30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17e40 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
17e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17e60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17e70 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
17e80 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
17e90 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
17ea0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
17eb0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
17ec0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
17ed0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
17ee0 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
17ef0 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
17f00 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17f10 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17f30 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
17f40 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65  ) );..  btreeCle
17f50 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
17f60 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
17f70 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
17f80 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56  & p->db->activeV
17f90 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20  dbeCnt>1 ){.    
17fa0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17fb0 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
17fc0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
17fd0 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
17fe0 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
17ff0 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
18000 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
18010 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
18020 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
18030 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
18040 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
18050 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
18060 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
18070 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
18080 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
18090 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
180a0 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
180b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
180c0 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
180d0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
180e0 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
180f0 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
18100 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18110 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
18120 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
18130 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
18140 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
18150 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
18160 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
18170 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
18180 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
18190 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
181a0 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
181b0 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
181c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
181d0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
181e0 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
181f0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
18200 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
18210 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
18220 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
18230 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
18240 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
18250 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18260 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
18270 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18280 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
18290 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
182a0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
182b0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
182c0 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
182d0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
182e0 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
182f0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
18300 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
18310 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
18320 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
18330 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
18340 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
18350 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
18360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18370 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18380 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
18390 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
183a0 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
183b0 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
183c0 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
183d0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
183e0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
183f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
18400 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
18410 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
18420 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
18430 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
18440 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
18450 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
18460 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
18470 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
18480 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
18490 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
184a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
184b0 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
184c0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
184d0 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
184e0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
184f0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
18500 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
18510 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
18520 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
18530 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
18540 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
18550 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
18560 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
18570 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
18580 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
18590 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
185a0 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  locks..**.** Thi
185b0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
185c0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
185d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
185e0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
185f0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
18600 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
18610 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
18620 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
18630 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
18640 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
18650 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
18660 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
18670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18680 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
18690 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
186a0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
186b0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
186c0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
186d0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
186e0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
186f0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
18700 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
18710 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
18720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18730 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18740 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
18750 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
18760 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18770 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
18780 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18790 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
187a0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
187b0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
187c0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
187d0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
187e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
187f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
18800 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
18810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18820 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
18830 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
18840 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  NS_READ;.  }..  
18850 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
18860 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
18870 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18890 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
188a0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
188b0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
188c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
188d0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
188e0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
188f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18910 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
18920 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
18930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18950 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18960 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
18970 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18980 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
18990 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
189a0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
189b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
189c0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
189d0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
189e0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
189f0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
18a00 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
18a10 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
18a20 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
18a30 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
18a40 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
18a50 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
18a60 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
18a70 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
18a80 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
18a90 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
18aa0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18ab0 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
18ac0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
18ad0 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
18ae0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
18af0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
18b00 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
18b10 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
18b20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
18b30 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
18b40 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
18b50 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
18b60 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
18b70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
18b80 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
18b90 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
18ba0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
18bb0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
18bc0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
18bd0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
18be0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
18bf0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
18c00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
18c10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18c20 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
18c30 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
18c40 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
18c50 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
18c60 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
18c70 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
18c80 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
18c90 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
18ca0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
18cb0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
18cc0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
18cd0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
18ce0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
18cf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18d00 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
18d10 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
18d20 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
18d30 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
18d40 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
18d50 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
18d60 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
18d70 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
18d80 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
18d90 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
18da0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
18db0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
18dc0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
18dd0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
18de0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
18df0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
18e00 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
18e10 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
18e20 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
18e30 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
18e40 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
18e50 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
18e60 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
18e70 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
18e80 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
18e90 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
18ea0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
18eb0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
18ec0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
18ed0 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
18ee0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
18ef0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
18f00 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
18f10 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
18f20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
18f30 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
18f40 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
18f50 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
18f60 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
18f70 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
18f80 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  de;.    for(i=0;
18f90 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
18fa0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
18fb0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
18fc0 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
18fd0 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
18fe0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
18ff0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
19000 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  e);.}../*.** Rol
19010 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
19020 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
19030 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
19040 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
19050 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
19060 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
19070 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
19080 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
19090 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
190a0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
190b0 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
190c0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
190d0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
190e0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
190f0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
19100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19110 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
19120 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
19130 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
19140 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
19150 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
19160 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
19170 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  k(Btree *p){.  i
19180 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
19190 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
191a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
191b0 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
191c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
191d0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
191e0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
191f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19200 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
19210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19220 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
19230 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
19240 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
19250 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
19260 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
19270 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
19280 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
19290 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
192a0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
192b0 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
192c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
192d0 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
192e0 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
192f0 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
19300 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
19310 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
19320 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
19330 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
19340 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
19350 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
19360 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
19370 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
19380 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
19390 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
193a0 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
193b0 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
193c0 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
193d0 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
193e0 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
193f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19400 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
19410 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64  p, rc);.  }.#end
19420 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
19430 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
19440 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19450 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
19460 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
19470 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
19480 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
19490 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
194a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
194b0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
194c0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
194d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
194e0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
194f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
19500 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
19510 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
19520 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
19530 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
19540 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
19550 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
19560 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
19570 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
19580 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
19590 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
195a0 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
195b0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
195c0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
195d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
195e0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
195f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
19600 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
19610 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
19620 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19630 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
19640 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
19650 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
19660 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19670 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19680 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
19690 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
196a0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
196b0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
196c0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
196d0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
196e0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
196f0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
19700 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
19710 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
19720 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
19730 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
19740 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
19750 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
19760 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
19770 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
19780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
19790 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
197a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
197b0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
197c0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
197d0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
197e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
197f0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
19800 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
19810 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
19820 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
19830 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
19840 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
19850 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
19860 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
19870 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
19880 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
19890 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
198a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
198b0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
198c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
198d0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
198e0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
198f0 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
19900 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
19910 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
19920 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
19930 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
19940 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
19950 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
19960 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
19970 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
19980 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
19990 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
199a0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
199b0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
199c0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
199d0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
199e0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
199f0 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
19a00 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
19a10 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
19a20 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
19a30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
19a40 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
19a50 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
19a60 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
19a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
19a80 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
19a90 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
19aa0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
19ab0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19ac0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
19ad0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19ae0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
19af0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19b00 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
19b10 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
19b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
19b30 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
19b40 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
19b50 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
19b60 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  int );.  if( NEV
19b70 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ER(p->inTrans!=T
19b80 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42  RANS_WRITE || pB
19b90 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
19ba0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19bb0 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73  INTERNAL;.  }els
19bc0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
19bd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19be0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
19bf0 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20  ;.    /* At the 
19c00 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
19c10 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
19c20 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
19c30 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  int with.    ** 
19c40 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
19c50 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
19c60 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
19c70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
19c80 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
19c90 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
19ca0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
19cb0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
19cc0 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
19cd0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
19ce0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
19cf0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
19d00 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
19d10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
19d20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
19d30 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
19d40 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
19d50 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
19d60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19d80 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
19d90 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
19da0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
19db0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
19dc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
19dd0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
19de0 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
19df0 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
19e00 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
19e10 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
19e20 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
19e30 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
19e40 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
19e50 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
19e60 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
19e70 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
19e80 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
19e90 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
19ea0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
19eb0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
19ec0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
19ed0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
19ee0 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
19ef0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
19f00 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
19f10 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
19f20 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
19f30 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
19f40 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
19f50 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
19f60 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
19f70 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
19f80 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
19f90 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19fa0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
19fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19fc0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
19fd0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
19fe0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
19ff0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a000 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
1a010 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a020 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1a030 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1a040 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1a050 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
1a060 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
1a070 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1a080 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1a090 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
1a0a0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
1a0b0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
1a0c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
1a0d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a0e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
1a0f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a100 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1a110 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
1a120 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
1a130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a140 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
1a150 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1a160 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1a170 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a180 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a190 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1a1a0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1a1b0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1a1c0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1a1d0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1a1e0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1a1f0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1a200 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1a210 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1a220 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1a230 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1a240 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1a250 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1a260 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1a270 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1a280 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1a290 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1a2a0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1a2b0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1a2c0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a2d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1a2e0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1a2f0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1a300 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1a310 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1a320 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1a330 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1a340 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1a350 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1a360 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1a370 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1a380 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1a390 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1a3a0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1a3b0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1a3c0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1a3d0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1a3e0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1a3f0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1a400 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1a410 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1a420 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1a430 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a440 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1a450 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1a460 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1a470 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1a480 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1a490 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1a4a0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1a4b0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1a4c0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1a4d0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1a4e0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1a4f0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1a500 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1a510 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1a520 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1a530 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1a540 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1a550 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a560 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1a570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1a580 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1a590 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1a5a0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1a5b0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1a5c0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1a5d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1a5e0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1a5f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1a600 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1a610 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1a620 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1a630 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1a640 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1a650 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1a660 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1a670 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1a680 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1a690 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1a6a0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1a6b0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1a6c0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1a6d0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1a6e0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1a6f0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1a700 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1a710 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1a720 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a750 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a760 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1a790 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1a7a0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1a7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7d0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a7e0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a7f0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a800 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a810 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1a820 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1a830 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1a840 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1a870 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1a880 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a890 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1a8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1a8b0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1a8c0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1a8d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a8e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a8f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1a900 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1a910 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1a920 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1a930 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1a940 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1a950 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1a960 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1a970 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1a980 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1a990 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1a9a0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1a9b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1a9c0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1a9d0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1a9e0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1a9f0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1aa00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1aa10 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1aa20 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1aa30 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1aa40 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1aa50 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1aa60 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1aa70 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1aa80 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1aa90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1aaa0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1aab0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1aac0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1aad0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1aae0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1aaf0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1ab00 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1ab10 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1ab20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1ab30 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1ab40 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1ab50 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1ab60 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1ab70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1ab80 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1ab90 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1aba0 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
1abb0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1abc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1abd0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1abe0 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1abf0 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1ac00 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1ac10 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1ac20 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1ac30 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1ac40 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1ac50 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1ac60 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1ac70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1ac80 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1ac90 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1aca0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1acb0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1acc0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1acd0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1ace0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1acf0 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1ad00 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1ad10 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1ad20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1ad30 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1ad40 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1ad50 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1ad60 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1ad70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1ad80 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1ad90 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1ada0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1adb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1adc0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1add0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1ae10 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae40 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1ae50 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1ae60 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae90 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1aea0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1aeb0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1aec0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1aee0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1aef0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1af00 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1af30 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1af40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1af50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1af60 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1af70 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1af80 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1af90 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1afa0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1afb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1afc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1afd0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1afe0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1aff0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1b000 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1b010 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1b020 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1b030 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1b040 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1b050 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1b060 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1b070 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1b080 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1b090 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1b0a0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1b0b0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1b0c0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1b0d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b0e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b0f0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1b100 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1b110 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1b120 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1b130 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1b140 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1b150 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1b160 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1b170 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1b180 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1b190 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1b1a0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1b1b0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1b1c0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1b1d0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1b1e0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1b1f0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1b200 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1b210 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1b220 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1b230 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1b240 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1b250 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1b260 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1b270 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1b280 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b290 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1b2a0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1b2b0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1b2c0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1b2d0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1b2e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68  .** Set the cach
1b2f0 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f  ed rowid value o
1b300 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69  f every cursor i
1b310 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
1b320 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70  ase file.** as p
1b330 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74  Cur and having t
1b340 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67  he same root pag
1b350 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72  e number as pCur
1b360 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
1b370 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64  ** set to iRowid
1b380 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73  ..**.** Only pos
1b390 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75  itive rowid valu
1b3a0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1b3b0 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73  d valid for this
1b3c0 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63   cache..** The c
1b3d0 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69  ache is initiali
1b3e0 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64  zed to zero, ind
1b3f0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c  icating an inval
1b400 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62  id cache..** A b
1b410 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66  tree will work f
1b420 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72  ine with zero or
1b430 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1b440 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f  .  We just canno
1b450 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20  t.** cache zero 
1b460 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1b470 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ds, which means 
1b480 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1b490 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74  zero or.** negat
1b4a0 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74  ive rowids might
1b4b0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1b4c0 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72  ower.  But in pr
1b4d0 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20  actice, zero.** 
1b4e0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1b4f0 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f  ds are very unco
1b500 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f  mmon so this sho
1b510 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f  uld not be a pro
1b520 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
1b530 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
1b540 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1b550 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33  r *pCur, sqlite3
1b560 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a  _int64 iRowid){.
1b570 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1b580 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74   for(p=pCur->pBt
1b590 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1b5a0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1b5b0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
1b5c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1b5d0 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20   p->cachedRowid 
1b5e0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20  = iRowid;.  }.  
1b5f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61  assert( pCur->ca
1b600 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69  chedRowid==iRowi
1b610 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d );.}../*.** Re
1b620 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20  turn the cached 
1b630 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69  rowid for the gi
1b640 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e  ven cursor.  A n
1b650 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a  egative or zero.
1b660 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1b670 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1b680 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69  he rowid cache i
1b690 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
1b6a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72  ould be.** ignor
1b6b0 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69  ed.  If the rowi
1b6c0 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65  d cache has neve
1b6d0 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65  r before been se
1b6e0 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72  t, then a.** zer
1b6f0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1b700 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1b710 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43  sqlite3BtreeGetC
1b720 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1b730 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1b740 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65  turn pCur->cache
1b750 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dRowid;.}../*.**
1b760 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1b770 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1b780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b790 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1b7a0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1b7b0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1b7c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b7d0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1b7e0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1b7f0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1b800 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1b810 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1b820 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b830 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1b840 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1b850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b860 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1b870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1b880 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1b890 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1b8a0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1b8b0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1b8c0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1b8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b8e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1b8f0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1b900 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1b910 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1b920 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1b930 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1b940 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1b950 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1b960 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1b970 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1b980 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1b990 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1b9a0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1b9b0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
1b9c0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
1b9d0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
1b9e0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1b9f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1ba00 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1ba10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ba20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ba30 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1ba40 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1ba50 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1ba60 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1ba70 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1ba80 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1ba90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1baa0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1bab0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1bac0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1bad0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1bae0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1baf0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1bb00 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1bb10 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1bb20 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1bb30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1bb40 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1bb50 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1bb60 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1bb70 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1bb80 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1bb90 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1bba0 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1bbb0 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1bbc0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1bbd0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1bbe0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1bbf0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1bc00 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1bc10 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1bc20 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1bc30 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1bc40 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1bc50 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1bc60 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1bc70 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1bc80 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1bc90 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1bca0 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1bcb0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1bcc0 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1bcd0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1bce0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1bcf0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1bd00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1bd10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1bd20 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1bd30 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1bd40 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1bd50 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1bd60 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1bd70 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1bd80 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1bd90 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1bda0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1bdb0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1bdc0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1bdd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1bde0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1bdf0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1be00 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1be10 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1be20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1be30 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1be40 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1be50 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1be60 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1be70 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1be80 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1be90 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1bea0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1beb0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bec0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1bed0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1bee0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1bef0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1bf00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1bf10 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1bf20 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1bf30 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1bf40 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1bf50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1bf60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bf70 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1bf80 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1bf90 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1bfa0 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1bfb0 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1bfc0 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1bfd0 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1bfe0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1bff0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1c000 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1c010 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1c050 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1c060 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1c0a0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1c0b0 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1c0f0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1c100 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1c110 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1c120 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1c130 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1c140 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1c1e0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1c1f0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1c230 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1c240 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1c250 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1c260 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1c270 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1c280 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1c290 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1c2a0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1c2b0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1c2c0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1c2d0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1c2e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1c2f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1c300 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1c310 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1c320 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1c330 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1c340 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1c350 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1c360 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1c370 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1c380 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1c390 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1c3a0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1c3b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1c3c0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1c3d0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1c3e0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1c3f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1c400 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1c410 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1c420 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1c430 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1c440 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1c450 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1c460 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1c470 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1c480 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1c490 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1c4a0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1c4b0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1c4c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1c4d0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1c4e0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1c4f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1c500 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1c510 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1c520 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1c530 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1c540 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1c550 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1c560 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1c570 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1c580 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1c590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c5a0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1c5b0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1c5c0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1c5d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c5e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c5f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c600 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1c610 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1c620 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c630 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1c640 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1c650 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1c660 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1c670 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1c680 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1c690 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1c6a0 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1c6b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c6c0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1c6d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1c6e0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1c6f0 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1c700 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1c710 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1c720 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1c730 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1c740 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1c750 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1c760 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1c770 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1c780 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1c790 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1c7a0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1c7b0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1c7c0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1c7d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1c7e0 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1c7f0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1c800 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1c810 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1c820 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1c830 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1c840 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1c850 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1c860 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1c870 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1c880 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1c890 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1c8a0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1c8b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c8c0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1c8d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1c8e0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1c8f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1c900 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1c910 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1c920 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1c930 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
1c940 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
1c950 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1c960 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  .nData;.  return
1c970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c980 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
1c990 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
1c9a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1c9b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1c9c0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
1c9d0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
1c9e0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
1c9f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1ca00 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1ca10 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
1ca20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
1ca30 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
1ca40 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
1ca50 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
1ca60 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
1ca70 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
1ca80 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1ca90 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
1caa0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
1cab0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
1cac0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1cad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1cae0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
1caf0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1cb00 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
1cb10 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1cb20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
1cb30 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
1cb40 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
1cb50 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
1cb60 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
1cb70 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
1cb80 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
1cb90 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
1cba0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
1cbb0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
1cbc0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1cbd0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
1cbe0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1cbf0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
1cc00 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
1cc10 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
1cc20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1cc30 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
1cc40 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
1cc50 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1cc60 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1cc70 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
1cc80 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
1cc90 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
1cca0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
1ccb0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
1ccc0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
1ccd0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1cce0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
1ccf0 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
1cd00 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
1cd10 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
1cd20 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
1cd30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1cd40 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1cd50 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cd70 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1cd80 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
1cd90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cda0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1cdb0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1cdc0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
1cdd0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1cde0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1cdf0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1ce00 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1ce10 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce30 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1ce40 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1ce50 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1ce60 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1ce70 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1ce80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1cea0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ceb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cec0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1ced0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1cee0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1cef0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1cf00 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1cf10 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1cf20 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1cf30 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1cf40 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1cf50 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1cf60 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1cf70 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1cf80 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1cf90 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1cfa0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1cfb0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1cfc0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1cfd0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1cfe0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1cff0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1d000 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1d010 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1d020 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1d030 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1d040 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1d050 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1d060 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1d070 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1d080 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1d090 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1d0a0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1d0b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1d0c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1d0d0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1d0e0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1d0f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1d100 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1d110 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d120 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1d130 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1d140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d150 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1d160 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1d170 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1d180 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1d190 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1d1a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d1b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d1c0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1d1d0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
1d1e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1d1f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d200 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d210 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d220 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1d230 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1d240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1d250 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1d260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d270 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1d280 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1d290 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1d2a0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1d2b0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1d2c0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1d2d0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1d2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1d2f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1d300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1d310 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1d320 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1d330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1d340 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1d350 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1d360 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1d370 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1d380 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1d390 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1d3a0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1d3b0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1d3c0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1d3d0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1d3e0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1d3f0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1d400 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1d410 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1d420 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1d430 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1d440 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1d450 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1d460 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1d470 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1d480 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1d490 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1d4a0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1d4b0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1d4c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d4d0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1d4e0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1d4f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1d500 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1d510 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1d520 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1d530 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d540 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1d550 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1d560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d570 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1d580 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d5a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d5b0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1d5c0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1d5e0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1d5f0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1d600 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1d610 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1d620 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1d630 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1d640 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1d650 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1d660 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1d670 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1d680 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1d690 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1d6a0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1d6b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1d6c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d6d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d6e0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1d6f0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1d700 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1d710 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1d720 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1d730 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1d740 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1d750 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1d760 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1d770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d780 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d790 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1d7a0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1d7b0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1d7c0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1d7d0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1d7e0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1d7f0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1d800 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1d810 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1d820 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1d830 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1d840 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1d850 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1d860 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1d870 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1d880 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1d890 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1d8a0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1d8b0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1d8c0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1d8d0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1d8e0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1d8f0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1d900 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1d910 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
1d920 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
1d930 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
1d940 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
1d950 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
1d960 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1d970 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1d980 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
1d990 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1d9a0 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1d9b0 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1d9c0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1d9d0 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1d9e0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1d9f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1da00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1da10 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1da20 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1da30 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1da40 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1da50 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1da60 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1da70 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1da80 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1da90 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1daa0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1dab0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1dac0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1dad0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1dae0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1daf0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1db00 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1db10 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1db20 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1db30 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1db40 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1db50 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1db60 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1db70 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1db80 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1db90 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1dba0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1dbb0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1dbc0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1dbd0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1dbe0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1dbf0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1dc00 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1dc10 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1dc20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1dc30 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1dc40 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1dc50 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1dc60 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1dc70 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1dc80 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1dc90 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1dca0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1dcb0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1dcc0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1dcd0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1dce0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1dcf0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1dd00 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1dd10 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1dd20 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1dd30 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1dd40 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1dd50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1dd60 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1dd70 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1dd80 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1dd90 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
1dda0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
1ddb0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
1ddc0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
1ddd0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1dde0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
1ddf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
1de00 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
1de10 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
1de20 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1de30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1de40 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
1de50 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
1de60 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
1de70 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1de80 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1de90 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
1dea0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
1deb0 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
1dec0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
1ded0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1dee0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1def0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1df00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1df10 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1df20 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
1df30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1df40 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
1df50 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1df60 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1df70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
1df80 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
1df90 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
1dfa0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
1dfb0 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
1dfc0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
1dfd0 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
1dfe0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1dff0 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
1e000 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
1e010 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
1e020 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
1e030 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
1e040 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
1e050 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
1e060 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
1e070 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
1e080 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
1e090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e0a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1e0b0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
1e0c0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
1e0d0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
1e0e0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
1e0f0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
1e100 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
1e110 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1e120 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1e130 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
1e140 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e150 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
1e160 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1e170 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
1e180 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
1e190 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1e1a0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1e1b0 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
1e1c0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
1e1d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
1e1e0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
1e1f0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
1e200 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
1e210 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1e220 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1e230 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1e240 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
1e250 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
1e260 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1e270 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
1e280 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
1e290 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
1e2a0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
1e2b0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e2c0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
1e2d0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
1e2e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e2f0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e300 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
1e310 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1e320 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
1e330 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
1e340 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
1e350 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1e360 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
1e370 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
1e380 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
1e390 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
1e3a0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
1e3b0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1e3c0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
1e3d0 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
1e3e0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
1e3f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1e400 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
1e410 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
1e420 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
1e430 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
1e440 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
1e450 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
1e460 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
1e470 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
1e480 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
1e490 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
1e4a0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
1e4b0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1e4c0 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
1e4d0 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
1e4e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
1e4f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
1e500 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
1e510 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
1e520 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
1e530 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
1e540 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
1e550 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
1e560 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
1e570 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
1e580 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
1e590 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
1e5a0 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
1e5b0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
1e5c0 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
1e5d0 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
1e5e0 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
1e5f0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1e600 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
1e610 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1e620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
1e640 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e650 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1e660 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1e670 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
1e680 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
1e690 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
1e6a0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
1e6b0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
1e6c0 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
1e6d0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
1e6e0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1e6f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
1e700 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
1e710 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
1e720 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
1e730 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1e740 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e750 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
1e760 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
1e770 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
1e780 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
1e790 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
1e7a0 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
1e7b0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
1e7c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e7d0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e7e0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
1e7f0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
1e800 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1e810 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
1e820 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1e830 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1e840 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
1e850 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e860 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
1e870 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
1e880 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
1e890 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1e8a0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1e8b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1e8c0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
1e8d0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
1e8e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
1e8f0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
1e900 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
1e910 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
1e920 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1e930 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
1e940 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1e950 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
1e960 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1e970 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
1e980 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
1e990 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
1e9a0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
1e9b0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
1e9c0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1e9d0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1e9e0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1e9f0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1ea00 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1ea10 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1ea20 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1ea30 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1ea40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1ea50 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1ea60 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1ea70 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1ea80 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1ea90 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1eaa0 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1eab0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1eac0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1ead0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1eae0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1eaf0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
1eb00 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
1eb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1eb20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
1eb30 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
1eb40 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
1eb50 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
1eb60 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
1eb70 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
1eb80 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
1eb90 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
1eba0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
1ebb0 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
1ebc0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
1ebd0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1ebe0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ebf0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
1ec00 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
1ec10 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
1ec20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ec30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec40 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
1ec50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1ec60 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
1ec70 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1ec80 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
1ec90 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
1eca0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
1ecb0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
1ecc0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
1ecd0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
1ece0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ecf0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
1ed00 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1ed10 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
1ed20 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
1ed30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
1ed40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ed50 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1ed60 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
1ed70 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
1ed80 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
1ed90 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
1eda0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1edb0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
1edc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1edd0 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
1ede0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1edf0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1ee00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ee10 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1ee20 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
1ee30 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1ee40 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1ee50 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1ee60 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1ee70 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1ee80 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1ee90 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1eea0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1eeb0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1eec0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
1eed0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
1eee0 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
1eef0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
1ef00 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1ef10 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1ef20 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1ef30 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1ef40 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1ef50 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1ef60 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1ef70 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1ef80 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1ef90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1efa0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1efb0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1efc0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1efd0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
1efe0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1eff0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f000 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f010 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f020 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1f030 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1f040 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f050 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1f060 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1f070 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f080 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1f090 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1f0a0 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
1f0b0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1f0c0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
1f0d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1f0e0 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
1f0f0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1f100 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
1f110 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1f120 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1f130 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1f140 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1f150 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1f160 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1f170 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1f180 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1f190 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1f1a0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1f1b0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1f1c0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1f1d0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1f1e0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1f1f0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
1f200 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
1f210 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
1f220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f230 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
1f240 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1f250 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1f260 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1f270 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
1f280 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1f290 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
1f2a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1f2b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1f2c0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
1f2d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f2e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f2f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f300 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1f310 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1f320 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1f330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f340 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f350 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f360 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
1f370 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1f380 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1f390 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1f3a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f3b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f3c0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1f3d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1f3e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
1f3f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
1f400 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1f410 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
1f420 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f430 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1f440 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1f450 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1f460 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1f470 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1f480 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f490 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1f4a0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1f4b0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1f4c0 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1f4d0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1f4e0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1f4f0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1f500 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1f510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1f520 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1f530 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1f540 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1f550 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1f560 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1f570 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1f580 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1f590 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1f5a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f5b0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1f5c0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1f5d0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1f5e0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1f5f0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1f600 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1f610 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1f620 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1f630 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1f640 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1f650 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1f660 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1f670 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1f680 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1f690 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1f6a0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1f6b0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1f6c0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1f6d0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1f6e0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1f6f0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
1f700 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1f710 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1f720 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1f730 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1f740 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1f750 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1f760 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1f770 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1f780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f790 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1f7a0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1f7b0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1f7c0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1f7d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1f7e0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1f7f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1f800 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1f810 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1f820 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1f830 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1f840 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1f850 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1f860 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1f870 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1f880 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1f890 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1f8a0 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1f8b0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1f8c0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1f8d0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1f8e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1f8f0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1f900 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1f910 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1f920 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1f930 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1f940 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f950 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f960 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1f970 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f980 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f990 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f9a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f9b0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1f9c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f9d0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1f9e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f9f0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1fa00 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
1fa10 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66   NEVER(pCur->inf
1fa20 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20  o.nSize==0) ){. 
1fa30 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1fa40 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
1fa50 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75  Cur->iPage], pCu
1fa60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1fa70 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
1fa80 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d            &pCur-
1fa90 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50  >info);.  }.  aP
1faa0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1fab0 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
1fac0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
1fad0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
1fae0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1faf0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
1fb00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1fb10 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
1fb20 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1fb30 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
1fb40 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
1fb50 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
1fb60 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1fb70 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
1fb80 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
1fb90 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
1fba0 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  Local;.    asser
1fbb0 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20  t( nLocal<=nKey 
1fbc0 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
1fbd0 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1fbe0 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1fbf0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1fc00 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1fc10 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1fc20 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1fc30 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1fc40 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1fc50 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1fc60 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1fc70 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1fc80 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1fc90 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1fca0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1fcb0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1fcc0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1fcd0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1fce0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1fcf0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1fd00 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1fd10 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1fd20 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1fd30 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1fd40 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1fd50 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1fd60 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1fd70 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1fd80 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1fd90 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1fda0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1fdb0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1fdc0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1fdd0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1fde0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1fdf0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1fe00 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1fe10 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1fe20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1fe30 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1fe40 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1fe50 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1fe60 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1fe70 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
1fe80 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
1fe90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fea0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1feb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1fec0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fed0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1fee0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
1fef0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ff00 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
1ff10 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
1ff20 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1ff30 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1ff40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1ff50 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1ff60 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1ff70 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1ff80 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1ff90 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
1ffa0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
1ffb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ffc0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1ffd0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1ffe0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1fff0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20000 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
20010 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20020 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
20030 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
20040 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
20050 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
20060 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
20070 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
20080 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
20090 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
200a0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
200b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
200c0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
200d0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
200e0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
200f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20100 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
20110 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
20120 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
20130 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
20140 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
20150 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
20160 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
20170 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
20180 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
20190 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
201a0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
201b0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
201c0 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
201d0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
201e0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
201f0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
20200 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
20210 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
20220 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
20230 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
20240 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
20250 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20260 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
20270 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20280 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20290 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
202a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
202b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
202c0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
202d0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
202e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
202f0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
20300 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
20310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20320 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20330 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
20340 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
20350 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
20360 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20370 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
20380 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
20390 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
203a0 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
203b0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
203c0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
203d0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
203e0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
203f0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
20400 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
20410 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
20420 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
20430 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
20440 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20450 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
20460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20470 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
20480 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
20490 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
204a0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
204b0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
204c0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
204d0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
204e0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
204f0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
20500 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
20510 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
20520 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
20530 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
20540 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
20550 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
20560 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
20570 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
20580 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
20590 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
205a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
205b0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
205c0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
205d0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
205e0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
205f0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
20600 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
20610 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
20620 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
20630 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
20640 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
20650 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
20660 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
20670 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20680 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
20690 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
206a0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
206b0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
206c0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
206d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
206e0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
206f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
20700 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
20710 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
20720 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
20730 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
20740 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
20750 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
20760 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
20770 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
20780 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
20790 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
207a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
207b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
207c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
207d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
207e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
207f0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
20800 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
20810 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
20820 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
20830 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20840 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20850 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20860 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20870 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
20880 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
20890 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
208a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
208b0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
208c0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
208d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
208e0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
208f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20900 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
20910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20920 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
20930 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
20940 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20950 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
20960 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
20970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20980 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
20990 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
209a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
209b0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
209c0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
209d0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
209e0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
209f0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
20a00 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
20a10 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
20a20 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
20a30 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
20a40 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
20a50 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
20a60 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
20a70 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
20a80 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
20a90 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
20aa0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
20ab0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
20ac0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
20ad0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
20ae0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
20af0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
20b00 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
20b10 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
20b20 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
20b30 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
20b40 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
20b50 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
20b60 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
20b70 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
20b80 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
20b90 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
20ba0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
20bb0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
20bc0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
20bd0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
20be0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
20bf0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
20c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
20c10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
20c20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
20c30 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
20c40 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
20c50 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
20c60 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20c70 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
20c80 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
20c90 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
20ca0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
20cb0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
20cc0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
20cd0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
20ce0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
20cf0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
20d00 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
20d10 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
20d20 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
20d30 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
20d40 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
20d50 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
20d60 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
20d70 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
20d80 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
20d90 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
20da0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
20db0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
20dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
20dd0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
20de0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
20df0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
20e00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20e10 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
20e20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
20e30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20e40 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
20e50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20e60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20e70 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
20e80 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
20e90 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
20ea0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
20eb0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
20ec0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
20ed0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
20ee0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
20ef0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
20f00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20f10 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
20f20 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
20f30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20f40 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
20f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
20f60 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
20f70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
20f80 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
20f90 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
20fa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20fb0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
20fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
20fd0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
20fe0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
20ff0 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
21000 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
21010 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
21020 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
21030 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21040 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  iPage = 0;.  }el
21050 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
21060 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
21070 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
21080 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
21090 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
210a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
210b0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
210c0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
210d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
210e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
210f0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
21100 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
21110 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
21120 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
21130 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
21140 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
21150 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
21160 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
21170 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
21180 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
21190 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
211a0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
211b0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
211c0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
211d0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
211e0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
211f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
21200 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
21210 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21220 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
21230 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
21240 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
21250 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
21260 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
21270 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
21280 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
21290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
212a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
212b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
212c0 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
212d0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
212e0 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
212f0 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
21300 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
21310 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
21320 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
21330 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
21340 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
21350 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
21360 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
21370 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
21380 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
21390 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
213a0 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
213b0 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
213c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
213d0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
213e0 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
213f0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
21400 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
21410 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
21420 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
21430 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
21440 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
21450 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
21460 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
21470 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
21480 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
21490 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
214a0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
214b0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
214c0 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
214d0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
214e0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
214f0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
21500 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
21510 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
21520 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
21530 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
21540 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
21550 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
21560 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
21570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21590 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
215a0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
215b0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
215c0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
215d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
215e0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
215f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
21600 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
21610 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
21620 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
21630 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
21640 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
21650 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
21660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21670 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
21680 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
21690 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
216a0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
216b0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
216c0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
216d0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
216e0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
216f0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
21700 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
21710 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
21720 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
21730 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
21740 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
21750 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
21760 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
21770 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
21780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
21790 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
217a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
217b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
217c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
217d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
217e0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
217f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21800 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
21810 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21820 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
21830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21840 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21850 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
21860 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
21870 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
21880 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
21890 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
218a0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
218b0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
218c0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
218d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
218e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
218f0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
21900 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
21910 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
21920 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
21930 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
21940 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
21950 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
21960 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
21970 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
21980 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
21990 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
219a0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
219b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
219c0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
219d0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
219e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
219f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
21a00 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
21a10 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
21a20 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
21a30 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
21a40 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
21a50 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
21a60 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
21a70 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
21a80 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
21a90 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
21aa0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
21ab0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
21ac0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21ad0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
21ae0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
21af0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21b00 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21b20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21b30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
21b40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21b50 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
21b60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21b70 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
21b80 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
21b90 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
21ba0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21bb0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
21bc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21bd0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
21be0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
21bf0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
21c00 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
21c10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21c20 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
21c30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21c40 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
21c50 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
21c60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
21c70 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21c80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
21c90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
21ca0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
21cb0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
21cc0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
21cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
21ce0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
21cf0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
21d00 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
21d10 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
21d20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
21d30 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
21d40 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
21d50 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
21d60 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
21d70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21d80 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
21d90 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
21da0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21db0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21dc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21dd0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21de0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21df0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
21e00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
21e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21e20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
21e30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21e40 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
21e50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21e60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e70 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
21e80 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
21e90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21ea0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
21eb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21ec0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21ed0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
21ee0 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
21ef0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
21f00 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
21f10 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
21f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21f30 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
21f40 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
21f50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
21f60 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
21f70 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
21f80 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
21f90 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
21fa0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
21fb0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
21fc0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
21fd0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
21fe0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
21ff0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22000 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
22010 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
22020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
22030 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22040 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22050 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22060 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
22070 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
22080 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
22090 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
220a0 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
220b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
220c0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
220d0 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
220e0 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
220f0 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74  tate && pCur->at
22100 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Last ){.#ifdef S
22110 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
22120 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
22130 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
22140 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
22150 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
22160 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
22170 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
22180 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
22190 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
221a0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
221b0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
221c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
221d0 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
221e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
221f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
22200 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22210 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22220 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
22230 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22240 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
22250 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22260 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22270 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
22280 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
22290 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
222a0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
222b0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
222c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
222d0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
222e0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
222f0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
22300 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
22310 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22320 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
22330 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
22340 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
22350 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
22360 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
22370 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
22380 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
22390 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
223a0 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
223b0 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
223c0 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
223d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
223e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
223f0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
22400 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
22410 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
22420 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
22430 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
22440 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
22450 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
22460 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
22470 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
22480 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
22490 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
224a0 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
224b0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
224c0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
224d0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
224e0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
224f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
22500 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
22510 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
22520 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
22530 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
22540 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
22550 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
22560 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
22570 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
22580 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
22590 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
225a0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
225b0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
225c0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
225d0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
225e0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
225f0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
22600 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
22610 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
22620 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
22630 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
22640 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
22650 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
22660 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
22670 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
22680 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
22690 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
226a0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
226b0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
226c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
226d0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
226f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
22700 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
22710 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
22720 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
22730 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
22740 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
22750 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
22760 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
22770 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
22780 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
22790 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
227a0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
227b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
227c0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
227d0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
227e0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
227f0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
22800 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
22810 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
22820 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
22840 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
22850 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
22860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22870 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
22880 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
22890 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
228a0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
228b0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
228c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
228d0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
228e0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
228f0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
22900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22910 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
22920 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
22930 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
22940 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
22950 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
22960 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
22970 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
22980 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
22990 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
229a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
229b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
229c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
229d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
229e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
229f0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
22a00 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
22a10 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
22a20 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
22a30 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
22a40 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
22a50 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
22a60 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
22a70 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
22a80 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
22a90 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
22aa0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
22ab0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
22ac0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
22ad0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
22ae0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22af0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
22b00 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
22b10 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
22b20 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
22b30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
22b40 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
22b50 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22b70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
22b80 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
22b90 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
22ba0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
22bb0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
22bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22bd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
22be0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
22bf0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
22c00 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22c10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
22c20 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22c30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
22c40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22c50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22c60 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
22c70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22c80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22c90 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  ge]->nCell>0 || 
22ca0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22cb0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
22cc0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
22cd0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
22ce0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
22cf0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
22d00 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22d10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22d20 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
22d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22d40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
22d50 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
22d60 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
22d70 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
22d80 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
22d90 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
22da0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
22db0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
22dc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
22dd0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
22de0 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
22df0 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
22e00 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
22e10 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
22e20 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
22e30 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
22e40 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
22e50 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
22e60 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
22e70 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
22e80 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
22e90 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
22ea0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
22eb0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
22ec0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
22ed0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
22ee0 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
22ef0 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
22f00 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
22f10 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
22f20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
22f30 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
22f40 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
22f50 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
22f60 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
22f70 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
22f80 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
22f90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22fa0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
22fb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22fc0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
22fd0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
22fe0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
22ff0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
23000 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
23010 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
23020 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23030 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75  >iPage] = (u16)u
23040 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
23050 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
23060 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23070 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f  (u16)((upr+lwr)/
23080 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
23090 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74  r(;;){.      int
230a0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
230b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
230c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
230d0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
230e0 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  ge */.      u8 *
230f0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
23120 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
23130 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43  age */..      pC
23140 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23150 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
23160 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
23170 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
23180 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
23190 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
231a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
231b0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
231c0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
231d0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
231e0 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
231f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
23200 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
23210 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
23220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23230 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
23240 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
23250 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
23260 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
23270 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
23280 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
23290 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
232a0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
232b0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
232c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
232d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
232e0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
232f0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
23300 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
23310 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
23320 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
23330 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
23340 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
23350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23360 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
23370 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
23380 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20 62  -size is 32768 b
23390 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
233a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
233b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
233c0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
233d0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
233e0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
233f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
23400 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62 79   at most 8198 by
23410 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20 62  tes, which may b
23420 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
23430 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
23440 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
23450 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
23460 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
23470 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
23480 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
23490 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
234a0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
234b0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
234c0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
234d0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
234e0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
234f0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
23500 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
23510 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
23520 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
23530 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
23540 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
23550 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
23560 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20      if( !(nCell 
23570 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c  & 0x80) && nCell
23580 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
23590 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
235a0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
235b0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
235c0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
235d0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
235e0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
235f0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
23600 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
23610 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
23620 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
23630 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
23640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
23650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
23660 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
23670 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
23680 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
23690 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
236a0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
236b0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
236c0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
236d0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
236e0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
236f0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
23700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
23710 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
23720 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
23730 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
23740 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
23750 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
23760 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
23770 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
23780 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  /.          c = 
23790 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
237a0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
237b0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
237c0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
237d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
237e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
237f0 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
23800 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
23810 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
23820 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
23830 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
23840 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
23850 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
23860 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
23870 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
23880 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
23890 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
238a0 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
238b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
238c0 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
238d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
238e0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
238f0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
23900 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
23910 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
23920 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
23930 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
23940 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
23950 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
23960 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
23970 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
23980 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
23990 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
239a0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
239b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
239c0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
239d0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20  lloc( nCell );. 
239e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
239f0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
23a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23a10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
23a20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
23a30 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
23a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23a50 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
23a60 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
23a70 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
23a80 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
23a90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23aa0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
23ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23ac0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
23ad0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
23ae0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
23af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23b00 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23b10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
23b20 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
23b30 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
23b40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23b50 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
23b60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23b70 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
23b80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
23b90 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
23ba0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
23bb0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
23bc0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
23bd0 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
23be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23c00 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
23c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23c20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
23c30 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
23c40 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
23c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23c60 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
23c70 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
23c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23c90 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
23ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23cb0 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
23cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23cd0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
23ce0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23cf0 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
23d00 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
23d10 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
23d20 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
23d30 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
23d40 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
23d50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
23d60 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
23d70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
23d80 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
23d90 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
23da0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
23db0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
23dc0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
23dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
23de0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
23df0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
23e00 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
23e10 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
23e20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23e30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23e40 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
23e50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23e60 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
23e70 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
23e80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23e90 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
23ea0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23eb0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
23ec0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23ed0 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
23ee0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23ef0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
23f00 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23f10 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
23f20 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
23f30 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
23f40 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
23f50 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
23f60 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72  _finish:.  retur
23f70 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
23f80 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
23f90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
23fa0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
23fb0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
23fc0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
23fd0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
23fe0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
23ff0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
24000 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
24010 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
24020 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
24030 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24040 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
24050 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
24060 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
24070 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
24080 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
24090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
240a0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
240b0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
240c0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
240d0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
240e0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
240f0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
24100 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
24110 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
24120 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
24130 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
24140 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
24150 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
24160 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
24170 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
24180 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
24190 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
241a0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
241b0 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
241c0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
241d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
241e0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
241f0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
24200 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
24210 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
24220 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
24230 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
24240 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
24250 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
24260 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
24270 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
24280 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
24290 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
242a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
242b0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
242c0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
242d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
242e0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
242f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24300 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
24310 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
24320 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
24330 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24340 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
24350 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
24360 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
24370 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24380 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
24390 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
243a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
243b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
243c0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
243d0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
243e0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
243f0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
24400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24410 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
24420 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
24430 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24440 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24450 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
24460 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24470 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
24480 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
24490 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d  .  assert( idx<=
244a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
244b0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
244c0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
244d0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
244e0 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
244f0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
24500 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
24510 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
24520 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24530 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
24540 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
24550 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
24560 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
24570 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
24580 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
24590 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
245a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
245b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
245c0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
245d0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
245e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
245f0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
24600 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24610 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24620 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24630 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
24640 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
24650 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
24660 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
24670 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24680 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
24690 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
246a0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
246b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
246c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
246d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
246e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
246f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
24700 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
24710 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
24720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24730 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
24740 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
24750 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
24760 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
24770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
24780 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
24790 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
247a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
247b0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
247c0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
247d0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
247e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
247f0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
24800 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
24810 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
24820 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
24830 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
24840 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
24850 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
24860 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
24870 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
24880 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
24890 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
248a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
248b0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
248c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
248d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
248e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
248f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24900 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24910 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
24920 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
24930 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
24940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24960 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  }.  pCur->atLast
24970 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53   = 0;.  if( CURS
24980 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
24990 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
249a0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
249b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
249c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
249d0 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
249e0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
249f0 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
24a00 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
24a10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24a20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
24a30 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
24a40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24a50 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
24a60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
24a70 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
24a80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
24a90 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
24aa0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24ab0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
24ac0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24ad0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24ae0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
24af0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24b10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
24b20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
24b30 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
24b40 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
24b50 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24b60 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
24b70 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
24b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
24b90 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24ba0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24bb0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24bc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
24be0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
24bf0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
24c00 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
24c10 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
24c20 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24c30 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
24c40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24c50 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
24c60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24c70 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24c80 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24c90 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
24ca0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
24cb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24cc0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
24cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24ce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24cf0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
24d00 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
24d10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24d20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24d30 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
24d40 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
24d50 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
24d60 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
24d70 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
24d80 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
24d90 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
24da0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
24db0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
24dc0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
24dd0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
24de0 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
24df0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
24e00 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
24e10 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
24e20 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
24e30 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
24e40 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
24e50 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
24e60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24e70 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
24e80 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
24e90 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
24ea0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
24eb0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
24ec0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
24ed0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
24ee0 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
24ef0 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
24f00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24f10 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
24f20 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
24f30 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
24f40 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
24f50 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
24f60 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
24f70 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
24f80 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
24f90 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
24fa0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
24fb0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
24fc0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
24fd0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
24fe0 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
24ff0 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
25000 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
25010 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
25020 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
25030 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
25040 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
25050 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
25060 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
25070 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
25080 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
25090 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
250a0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
250b0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
250c0 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
250d0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
250e0 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
250f0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
25100 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
25110 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
25120 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
25130 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
25140 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
25150 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
25160 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
25170 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
25180 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
25190 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
251a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
251b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
251c0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
251d0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
251e0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
251f0 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
25200 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
25210 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
25220 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
25230 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
25240 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25250 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
25260 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
25270 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
25280 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25290 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
252a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
252b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
252c0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
252d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
252e0 6d 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  mxPage = pagerPa
252f0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
25300 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
25310 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
25320 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
25330 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
25340 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
25350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25370 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
25380 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
25390 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
253a0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
253b0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
253c0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
253d0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
253e0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
253f0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
25400 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
25410 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
25420 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
25430 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
25440 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
25450 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
25460 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
25470 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
25480 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
25490 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
254a0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
254b0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
254c0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
254d0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
254e0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
254f0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
25500 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25510 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
25520 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d  act && nearby<=m
25530 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75  xPage ){.      u
25540 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
25550 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
25560 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25570 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25580 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
25590 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
255a0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
255b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
255c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
255d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
255e0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
255f0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
25600 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
25610 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
25620 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
25630 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
25640 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
25650 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
25660 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
25670 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
25680 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
25690 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
256a0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
256b0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
256c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
256d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
256e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
256f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
25700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
25710 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25720 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
25730 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
25740 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
25750 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
25760 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
25770 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
25780 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
25790 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
257a0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
257b0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
257c0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
257d0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
257e0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
257f0 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
25800 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
25810 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
25820 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
25830 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
25840 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
25850 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
25860 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
25870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25880 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
25890 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
258a0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
258b0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
258c0 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
258d0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
258e0 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
258f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25910 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
25920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
25930 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
25940 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
25950 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
25960 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25970 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
25980 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
25990 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
259a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
259b0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
259c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
259d0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
259e0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
259f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
25a00 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
25a10 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
25a20 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
25a30 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
25a40 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
25a50 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
25a60 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
25a70 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
25a80 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
25a90 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
25aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
25ab0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
25ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25ad0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
25ae0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
25af0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
25b00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25b10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25b30 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
25b40 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
25b50 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
25b60 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
25b70 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25b80 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
25b90 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
25ba0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
25bb0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
25bc0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
25bd0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
25be0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
25bf0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
25c00 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
25c10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
25c20 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
25c30 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
25c40 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
25c50 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
25c60 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
25c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25c80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25c90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25ca0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
25cb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25cc0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
25cd0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
25ce0 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
25cf0 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
25d00 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
25d10 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
25d20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
25d30 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
25d40 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
25d50 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
25d60 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
25d70 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
25d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25d90 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
25da0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
25db0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
25dc0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
25dd0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
25de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25df0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
25e00 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
25e10 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25e20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25e30 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25e50 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
25e60 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
25e70 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25e80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25e90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25ea0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
25eb0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
25ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ed0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
25ee0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
25ef0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
25f00 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
25f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25f30 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
25f40 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
25f50 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
25f60 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
25f70 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
25f80 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
25f90 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
25fa0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
25fb0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
25fc0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
25fd0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
25fe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
25ff0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
26000 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
26010 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
26020 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26030 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
26040 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
26050 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
26060 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26070 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26080 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
26090 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
260a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
260b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
260c0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
260d0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
260e0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
260f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
26100 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
26110 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
26120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26140 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26150 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26180 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
26190 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
261a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
261b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
261c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
261d0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
261e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
261f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26200 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
26210 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26220 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
26230 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
26240 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
26250 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
26260 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
26270 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
26280 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26290 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
262a0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
262b0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
262c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
262d0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
262e0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
262f0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
26300 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
26310 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
26320 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
26330 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
26340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
26350 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26360 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
26370 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
26380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
263a0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
263b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
263c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
263d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
263e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
263f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
26400 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26410 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
26420 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
26430 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
26440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26460 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
26470 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
26480 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
26490 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
264a0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
264b0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
264c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
264d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
264e0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
264f0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
26500 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
26510 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
26520 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
26530 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
26540 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
26550 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
26560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26570 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
26580 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
26590 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
265a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
265b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
265c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
265d0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
265e0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
265f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
26600 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
26610 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
26620 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
26630 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
26640 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
26650 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
26660 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
26670 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
26680 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
26690 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
266a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
266b0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
266c0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
266d0 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
266e0 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
266f0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
26700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
26710 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
26720 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
26730 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
26740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
26750 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26760 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
26770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
26780 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
26790 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
267a0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
267b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
267c0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
267d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
267e0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
267f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26800 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26810 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
26820 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26830 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
26840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26850 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
26860 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
26870 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
26880 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
26890 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
268a0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
268b0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
268c0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
268d0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
268e0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
268f0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26910 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
26920 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
26930 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
26940 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
26950 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
26960 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
26970 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
26980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
26990 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
269a0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
269b0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
269c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
269d0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
269e0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
269f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
26a00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26a10 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
26a20 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
26a30 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
26a40 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
26a50 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
26a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
26a70 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26a80 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
26a90 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
26aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26ac0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26ae0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
26af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26b00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26b20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26b30 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
26b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26b60 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
26b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b80 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
26b90 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
26ba0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
26bb0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
26bc0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
26bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26be0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
26bf0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
26c00 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
26c10 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
26c20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
26c30 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
26c40 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
26c50 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
26c60 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
26c70 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
26c80 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
26c90 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26ca0 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
26cb0 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
26cc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26cd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
26ce0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
26cf0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
26d00 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
26d10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
26d20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
26d30 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
26d40 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
26d50 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
26d60 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
26d70 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
26d80 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
26d90 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
26da0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
26db0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
26dc0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
26dd0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
26de0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
26df0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
26e00 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
26e10 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
26e20 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
26e30 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
26e40 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
26e50 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
26e60 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
26e70 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
26e80 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
26e90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26ea0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26eb0 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
26ec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26ef0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
26f00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
26f10 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
26f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26f30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26f40 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
26f50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
26f60 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
26f70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
26f80 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
26f90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
26fa0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
26fb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26fc0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
26fd0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
26fe0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
26ff0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
27000 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
27010 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27020 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
27030 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
27040 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27060 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
27070 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
27080 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
27090 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
270a0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
270b0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
270c0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
270d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
270e0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
270f0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
27100 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
27110 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27120 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
27130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27140 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
27150 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
27160 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
27170 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
27180 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
27190 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
271a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
271b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
271c0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
271d0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
271e0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
271f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27200 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
27210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27220 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
27230 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
27240 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
27250 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
27260 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
27270 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
27280 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
27290 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
272a0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
272b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
272c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
272d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
272e0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
272f0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
27300 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
27310 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
27320 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
27330 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
27340 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
27350 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
27360 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
27370 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
27380 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
27390 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
273a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
273b0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
273c0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
273d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
273e0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
273f0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
27400 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
27410 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
27420 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
27430 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
27440 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
27450 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
27460 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
27470 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
27480 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
27490 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
274a0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
274b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
274c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
274d0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
274e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
274f0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
27500 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
27510 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
27520 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
27530 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
27540 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27560 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
27570 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
27580 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
275b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
275c0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275e0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
275f0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
27600 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
27610 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27620 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
27630 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27640 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
27650 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
27660 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
27670 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
27680 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
27690 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
276a0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
276b0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
276c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
276d0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
276e0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
276f0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
27700 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
27710 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
27720 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
27730 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
27740 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
27750 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
27760 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
27770 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
27780 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
27790 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
277a0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
277b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
277c0 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69  ], nFree+1);..#i
277d0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
277e0 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
277f0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
27800 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
27810 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
27820 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
27830 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
27840 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
27850 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
27860 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
27870 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26  .  if( (!pPage &
27880 26 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  & (rc = btreeGet
27890 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
278a0 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
278b0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
278c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
278d0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
278e0 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
278f0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27900 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
27910 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
27920 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
27930 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
27940 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
27950 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
27960 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
27970 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
27980 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
27990 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
279a0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
279b0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
279c0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
279d0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
279e0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
279f0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
27a00 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
27a10 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
27a20 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
27a30 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
27a40 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
27a50 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
27a60 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
27a70 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
27a80 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
27a90 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
27aa0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
27ab0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
27ac0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
27ad0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
27ae0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
27af0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
27b00 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
27b10 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
27b20 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
27b30 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
27b40 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
27b50 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
27b60 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
27b70 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
27b80 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
27b90 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
27ba0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
27bb0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
27bc0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
27bd0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
27be0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
27bf0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
27c00 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
27c10 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
27c20 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
27c30 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
27c40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
27c50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
27c60 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
27c70 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
27c80 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
27c90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
27cb0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
27cc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
27cd0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
27ce0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
27cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
27d00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
27d10 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
27d20 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
27d30 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
27d40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
27d50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27d60 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
27d70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
27d80 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
27d90 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
27da0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
27db0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
27dc0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
27dd0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
27de0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
27df0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
27e00 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
27e10 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
27e20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
27e30 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
27e40 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
27e50 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
27e60 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
27e70 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
27e80 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
27e90 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
27ea0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
27eb0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
27ec0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
27ed0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
27ee0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
27ef0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
27f00 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
27f10 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
27f20 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
27f30 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
27f40 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
27f50 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
27f60 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
27f70 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
27f80 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
27f90 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
27fa0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
27fb0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
27fc0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
27fd0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
27fe0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
27ff0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
28000 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
28010 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
28020 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
28030 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
28040 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
28050 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
28060 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
28070 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
28080 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
28090 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
280a0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
280b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
280c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
280d0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
280e0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
280f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
28100 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28110 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28120 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
28130 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
28140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28150 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
28160 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
28170 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
28180 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
28190 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
281a0 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
281b0 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
281c0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
281d0 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  TE.        if( p
281e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
281f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
28200 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
28210 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28220 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
28230 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
28240 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
28250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
28260 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
28270 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
28280 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
28290 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
282a0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
282b0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
282c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
282d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
282e0 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
282f0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
28300 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
28310 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
28320 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
28330 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
28340 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
28350 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
28360 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
28370 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
28380 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
28390 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
283a0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
283b0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
283c0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
283d0 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
283e0 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
283f0 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
28400 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
28410 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
28420 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
28430 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
28440 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
28450 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
28460 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28470 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
28480 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
28490 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
284a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
284b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
284c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
284d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
284e0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
284f0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
28500 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
28510 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
28520 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
28530 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
28540 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
28550 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
28560 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
28570 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
28580 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
28590 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
285a0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
285b0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
285c0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
285d0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
285e0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
285f0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
28600 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
28610 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
28620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
28630 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
28640 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
28650 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
28660 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
28670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
28680 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
28690 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
286a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
286b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
286c0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
286d0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
286e0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
286f0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
28700 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
28710 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
28720 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
28730 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
28740 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
28750 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
28760 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
28770 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
28780 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
28790 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
287a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
287b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
287c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
287d0 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
287e0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
287f0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
28800 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
28810 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
28820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
28830 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
28840 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
28850 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
28860 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
28870 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
28880 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
28890 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
288a0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
288b0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
288c0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
288d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
288e0 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
288f0 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
28900 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
28910 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
28920 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
28930 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
28940 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
28950 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
28960 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
28970 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
28980 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
28990 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
289a0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65  || ovflPgno>page
289b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
289c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
289d0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
289e0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
289f0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
28a00 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
28a10 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
28a20 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
28a30 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
28a40 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
28a50 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
28a60 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
28a70 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
28a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28a90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
28aa0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
28ab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
28ac0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
28ad0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
28ae0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
28af0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28b00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28b10 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
28b20 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
28b30 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
28b40 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
28b50 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
28b60 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
28b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
28b80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28b90 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
28ba0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
28bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28bc0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
28bd0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
28be0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
28bf0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
28c00 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
28c10 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
28c20 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
28c30 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
28c40 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
28c50 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
28c60 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
28c70 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
28c80 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
28c90 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
28ca0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
28cb0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
28cc0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
28cd0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
28ce0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
28cf0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
28d00 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
28d10 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
28d20 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
28d30 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
28d40 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
28d50 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
28d60 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
28d70 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
28d80 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
28d90 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
28da0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
28db0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
28dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
28dd0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
28de0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
28df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28e00 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
28e10 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
28e20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28e30 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
28e40 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
28e50 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
28e60 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
28e70 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
28e80 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
28e90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
28ea0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
28eb0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
28ec0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
28ef0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
28f00 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
28f10 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f30 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
28f40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
28f50 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
28f60 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
28f70 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
28f80 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
28f90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
28fa0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
28fb0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
28fc0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
28fd0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
28fe0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
28ff0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
29000 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
29010 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
29020 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
29030 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
29040 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
29050 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29060 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
29070 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
29080 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
29090 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
290a0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
290b0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
290c0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
290d0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
290e0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
290f0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
29100 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
29110 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
29120 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
29130 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
29140 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
29150 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
29160 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29170 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29180 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
29190 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
291a0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
291b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
291c0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
291d0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
291e0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
291f0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
29200 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
29210 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
29220 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
29230 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
29240 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
29250 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
29260 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
29270 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
29280 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
29290 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
292a0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
292b0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
292c0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
292d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
292e0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
292f0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
29300 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
29310 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
29320 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
29330 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
29340 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
29350 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
29360 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
29370 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
29380 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
29390 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
293a0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
293b0 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
293c0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
293d0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
293e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
293f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
29400 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
29410 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
29420 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
29430 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
29440 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
29450 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
29460 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
29470 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
29480 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
29490 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
294a0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
294b0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
294c0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
294d0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
294e0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
294f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29500 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
29510 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
29520 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
29530 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
29540 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
29550 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
29560 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29570 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
29580 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
29590 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
295a0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
295b0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
295c0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
295d0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
295e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
295f0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
29600 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29610 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
29620 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
29630 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
29640 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
29650 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29660 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29670 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
29680 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
29690 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
296a0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
296b0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
296c0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
296d0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
296e0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
296f0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
29700 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
29710 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
29720 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
29730 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
29740 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
29750 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
29760 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
29770 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
29780 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
29790 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
297a0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
297b0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
297c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
297d0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
297e0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
297f0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
29800 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
29810 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
29820 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
29830 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
29840 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
29850 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
29860 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
29870 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29880 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29890 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
298a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
298b0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
298c0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
298d0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
298e0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
298f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
29900 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
29910 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
29920 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
29930 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
29940 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
29950 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
29960 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29970 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29980 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29990 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
299a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
299b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
299c0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
299d0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
299e0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
299f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
29a00 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
29a10 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
29a20 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
29a30 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
29a40 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
29a50 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
29a60 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
29a70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29a80 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
29a90 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
29aa0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
29ab0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
29ac0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
29ad0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
29ae0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
29af0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
29b00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29b10 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
29b20 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
29b30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
29b40 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
29b50 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
29b60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29b70 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
29b80 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
29b90 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
29ba0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
29bb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
29bc0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
29bd0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
29be0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
29bf0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
29c00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
29c10 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
29c20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
29c30 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
29c40 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
29c50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29c60 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
29c70 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
29c80 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
29c90 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
29ca0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
29cb0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
29cc0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
29cd0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
29ce0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
29cf0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
29d00 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
29d10 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
29d20 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
29d30 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
29d40 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
29d50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29d60 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
29d70 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
29d80 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
29d90 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
29da0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
29db0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
29dc0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
29dd0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
29de0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
29df0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
29e00 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
29e10 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
29e20 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
29e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
29e40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29e50 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
29e60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
29e70 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
29e80 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
29e90 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
29ea0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
29eb0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
29ec0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
29ed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ee0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
29ef0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
29f00 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
29f10 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
29f20 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
29f30 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
29f40 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
29f50 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
29f60 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
29f70 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
29f80 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
29f90 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
29fa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
29fb0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
29fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29fd0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
29fe0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
29ff0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2a000 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2a010 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2a020 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2a030 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2a040 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2a050 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2a060 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2a070 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2a080 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2a090 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2a0a0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2a0b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2a0c0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2a0d0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2a0e0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2a0f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2a100 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2a110 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2a120 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2a130 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2a140 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2a150 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2a160 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a170 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
2a180 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2a190 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
2a1a0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
2a1b0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
2a1c0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
2a1d0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
2a1e0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
2a1f0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
2a200 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
2a210 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2a220 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
2a230 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2a240 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2a250 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
2a260 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
2a270 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
2a280 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
2a290 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2a2a0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2a2b0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
2a2c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2a2d0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2a2e0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
2a2f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2a300 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a310 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2a320 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2a330 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a340 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2a350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a360 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2a370 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
2a380 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
2a390 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
2a3a0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
2a3b0 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
2a3c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2a3d0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
2a3e0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2a3f0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
2a400 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
2a410 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2a420 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
2a430 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2a440 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
2a450 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
2a460 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2a470 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
2a480 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a490 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
2a4a0 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
2a4b0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
2a4c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
2a4d0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
2a4e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
2a4f0 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d  =idx+1; i<pPage-
2a500 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72  >nCell; i++, ptr
2a510 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d  +=2){.    ptr[0]
2a520 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70   = ptr[2];.    p
2a530 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a  tr[1] = ptr[3];.
2a540 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2a550 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
2a560 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2a570 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2a580 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2a590 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2a5a0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2a5b0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2a5c0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2a5d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2a5e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2a5f0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2a600 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a610 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2a620 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2a630 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2a640 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2a650 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2a660 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2a670 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2a680 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2a690 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2a6a0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2a6b0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2a6c0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2a6d0 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
2a6e0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2a6f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a700 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2a710 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2a720 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2a730 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2a740 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2a750 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2a760 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2a770 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2a780 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2a790 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2a7a0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2a7b0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2a7c0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2a7d0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2a7e0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2a7f0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2a800 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2a810 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2a820 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2a830 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2a840 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a850 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2a860 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2a870 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2a880 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2a890 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2a8a0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2a8b0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2a8c0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2a8d0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2a8e0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2a8f0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2a900 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2a910 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2a920 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2a930 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2a940 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2a950 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2a960 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2a970 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2a980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2a990 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2a9a0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2a9b0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2a9c0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2a9d0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2a9e0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2a9f0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2aa00 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2aa10 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2aa20 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2aa30 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2aa40 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2aa50 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2aa60 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2aa70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2aa80 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
2aa90 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2aaa0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2aab0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2aac0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2aad0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2aae0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2aaf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2ab00 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2ab10 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2ab20 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2ab30 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2ab40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2ab50 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2ab60 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2ab70 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2ab80 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2ab90 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2aba0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2abb0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2abc0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2abd0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2abe0 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2abf0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
2ac00 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
2ac10 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
2ac20 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
2ac30 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
2ac40 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2ac50 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2ac60 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2ac70 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2ac80 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2ac90 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2aca0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2acb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2acc0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2acd0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2ace0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2acf0 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
2ad00 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2ad10 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2ad20 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
2ad30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ad40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2ad50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2ad60 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
2ad70 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
2ad80 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
2ad90 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
2ada0 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
2adb0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
2adc0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
2add0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
2ade0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
2adf0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
2ae00 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
2ae10 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
2ae20 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
2ae30 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
2ae40 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
2ae50 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
2ae60 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
2ae70 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
2ae80 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
2ae90 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
2aea0 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
2aeb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
2aec0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
2aed0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2aee0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2aef0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
2af00 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
2af10 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2af20 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
2af30 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
2af40 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
2af50 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
2af60 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
2af70 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2af80 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
2af90 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
2afa0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2afb0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
2afc0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2afd0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
2afe0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
2aff0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
2b000 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
2b010 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
2b020 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
2b030 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
2b040 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
2b050 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
2b060 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
2b070 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  u16)i;.  }else{.
2b080 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2b090 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b0a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2b0b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2b0d0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2b0e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2b0f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b100 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b110 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2b120 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
2b130 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2b140 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
2b150 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b160 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
2b170 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
2b180 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73  ->nCell;.    ins
2b190 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2b1a0 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  2*i;.    rc = al
2b1b0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
2b1c0 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
2b1d0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
2b1e0 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
2b1f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
2b200 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
2b210 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
2b220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2b230 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
2b240 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
2b250 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   success */.    
2b260 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65  assert( idx >= e
2b270 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  nd+2 );.    asse
2b280 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50  rt( idx+sz <= pP
2b290 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2b2a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
2b2b0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
2b2c0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
2b2d0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
2b2e0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2b2f0 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
2b300 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2b310 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
2b320 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2b330 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
2b340 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2b350 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70      for(j=end, p
2b360 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
2b370 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
2b380 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
2b390 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
2b3a0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
2b3b0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
2b3c0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2b3d0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2b3e0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2b3f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2b400 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2b410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b420 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2b430 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2b440 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2b450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2b460 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2b470 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2b480 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2b490 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2b4a0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2b4b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2b4c0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2b4d0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2b4e0 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2b4f0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2b500 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2b510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2b520 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2b530 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2b540 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2b550 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2b560 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2b570 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2b580 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2b590 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2b5a0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2b5b0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2b5c0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2b5d0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2b5e0 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2b5f0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2b600 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2b610 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2b620 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2b630 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2b640 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2b650 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2b660 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2b670 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2b680 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2b690 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2b6a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2b6b0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2b6c0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2b6d0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2b6e0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2b6f0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2b700 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2b710 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2b720 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2b730 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2b740 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2b750 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2b760 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2b770 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2b780 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2b790 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2b7a0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2b7b0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2b7c0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2b7d0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2b7e0 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2b7f0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2b800 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2b810 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2b820 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2b830 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b840 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b850 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2b860 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2b870 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28   nCell<=MX_CELL(
2b880 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2b890 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2b8a0 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
2b8b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2b8c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2b8d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2b8e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2b8f0 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a  t the page has j
2b900 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ust been zeroed 
2b910 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f  by zeroPage() */
2b920 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b930 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2b940 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2b950 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d  (&data[hdr+5])==
2b960 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43  nUsable );..  pC
2b970 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70  ellptr = &data[p
2b980 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b990 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63   + nCell*2];.  c
2b9a0 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c  ellbody = nUsabl
2b9b0 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c  e;.  for(i=nCell
2b9c0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
2b9d0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
2b9e0 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
2b9f0 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  -= aSize[i];.   
2ba00 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
2ba10 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
2ba20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2ba30 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
2ba40 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
2ba50 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2ba60 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2ba70 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2ba80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2ba90 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2baa0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2bab0 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2bac0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2bad0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2bae0 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2baf0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2bb00 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2bb10 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2bb20 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2bb30 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2bb40 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2bb50 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2bb60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2bb70 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2bb80 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2bb90 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2bba0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2bbb0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2bbc0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2bbd0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2bbe0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2bbf0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2bc00 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2bc10 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2bc20 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2bc30 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2bc40 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2bc50 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2bc60 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2bc70 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2bc80 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2bc90 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2bca0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2bcb0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2bcc0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2bcd0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2bce0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2bcf0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2bd00 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2bd10 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2bd20 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2bd30 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2bd40 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2bd50 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2bd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2bd70 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2bd80 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2bd90 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2bda0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2bdb0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2bdc0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2bdd0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2bde0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bdf0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2be00 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2be10 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2be20 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2be30 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2be40 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2be50 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2be60 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2be70 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2be80 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2be90 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2bea0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2beb0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2bec0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2bed0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2bee0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2bef0 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
2bf00 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
2bf10 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
2bf20 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
2bf30 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2bf40 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2bf50 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
2bf60 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
2bf70 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
2bf80 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
2bf90 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
2bfa0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
2bfb0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
2bfc0 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
2bfd0 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
2bfe0 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
2bff0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2c000 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
2c010 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
2c020 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
2c030 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
2c040 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
2c050 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
2c060 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2c070 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2c080 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
2c090 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
2c0a0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
2c0b0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
2c0c0 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
2c0d0 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
2c0e0 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
2c0f0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
2c100 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2c110 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
2c120 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
2c130 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
2c140 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
2c150 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
2c160 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2c170 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
2c180 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
2c190 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
2c1a0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
2c1b0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
2c1c0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2c1d0 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
2c1e0 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
2c1f0 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
2c200 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2c210 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
2c220 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
2c230 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2c240 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
2c250 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
2c260 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
2c270 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
2c280 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
2c290 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
2c2a0 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
2c2b0 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
2c2c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
2c2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c2e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
2c2f0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2c300 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c330 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
2c340 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2c370 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
2c380 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c390 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c3a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2c3b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c3c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2c3d0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2c3e0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2c3f0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c400 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ow==1 );..  if( 
2c410 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
2c420 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c430 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
2c440 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
2c450 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
2c460 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
2c470 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
2c480 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
2c490 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
2c4a0 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
2c4b0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
2c4c0 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
2c4d0 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
2c4e0 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
2c4f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2c500 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
2c510 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
2c520 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c530 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
2c540 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
2c550 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c560 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
2c570 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
2c580 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
2c590 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
2c5a0 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75  [0].pCell;.    u
2c5b0 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
2c5c0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2c5d0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
2c5e0 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
2c5f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2c600 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
2c610 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2c620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c630 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
2c640 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2c650 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
2c660 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
2c670 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
2c680 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2c690 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
2c6a0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
2c6b0 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
2c6c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2c6d0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2c6e0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2c6f0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2c700 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
2c710 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
2c720 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
2c730 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
2c740 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
2c750 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
2c760 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2c770 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
2c780 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
2c790 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
2c7a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
2c7b0 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
2c7c0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
2c7d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c7e0 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
2c7f0 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
2c800 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
2c810 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
2c820 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
2c830 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
2c840 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
2c850 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
2c860 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
2c870 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
2c880 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
2c890 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
2c8a0 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
2c8b0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
2c8c0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2c8d0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2c8e0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
2c8f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2c900 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
2c910 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2c920 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
2c930 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
2c940 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
2c950 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
2c960 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
2c970 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
2c980 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2c990 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
2c9a0 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
2c9b0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
2c9c0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
2c9d0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
2c9e0 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
2c9f0 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
2ca00 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
2ca10 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
2ca20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2ca30 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
2ca40 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
2ca50 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
2ca60 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
2ca70 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
2ca80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
2ca90 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
2caa0 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
2cab0 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
2cac0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
2cad0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2cae0 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
2caf0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
2cb00 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
2cb10 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
2cb20 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
2cb30 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
2cb40 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
2cb50 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
2cb60 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
2cb70 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2cb80 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
2cb90 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
2cba0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
2cbb0 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
2cbc0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
2cbd0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
2cbe0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
2cbf0 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
2cc00 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
2cc10 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
2cc20 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
2cc30 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
2cc40 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
2cc50 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2cc60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
2cc70 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2cc80 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
2cc90 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
2cca0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2ccb0 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
2ccc0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
2ccd0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
2cce0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2ccf0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
2cd00 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
2cd10 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
2cd20 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2cd30 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
2cd40 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2cd50 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
2cd60 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
2cd70 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
2cd80 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
2cd90 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
2cda0 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
2cdb0 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
2cdc0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
2cdd0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
2cde0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
2cdf0 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
2ce00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
2ce10 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
2ce20 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2ce30 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2ce40 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2ce50 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
2ce60 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
2ce70 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
2ce80 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2ce90 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2cea0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2ceb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2cec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2ced0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
2cee0 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
2cef0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2cf00 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
2cf10 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
2cf20 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
2cf30 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
2cf40 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
2cf50 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
2cf60 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
2cf70 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
2cf80 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
2cf90 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
2cfa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
2cfb0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
2cfc0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
2cfd0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
2cfe0 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
2cff0 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
2d000 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
2d010 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
2d020 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
2d030 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
2d040 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2d050 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
2d060 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2d070 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
2d080 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
2d090 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
2d0a0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2d0b0 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
2d0c0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
2d0d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
2d0e0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
2d0f0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
2d100 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2d110 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2d120 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
2d130 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
2d140 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
2d150 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
2d160 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
2d170 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
2d180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2d190 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2d1a0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
2d1b0 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
2d1c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2d1d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2d1e0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2d1f0 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
2d200 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2d210 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2d220 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d230 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2d240 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2d250 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
2d260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
2d270 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d280 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2d290 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2d2a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2d2b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2d2c0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2d2d0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2d2e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d2f0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2d300 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2d310 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
2d320 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2d330 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
2d340 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2d350 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
2d360 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
2d370 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
2d380 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
2d390 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
2d3a0 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
2d3b0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
2d3c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
2d3d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2d3e0 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
2d3f0 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
2d400 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
2d410 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
2d420 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
2d430 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
2d440 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
2d450 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
2d460 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
2d470 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
2d480 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
2d490 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
2d4a0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
2d4b0 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
2d4c0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
2d4d0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
2d4e0 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
2d4f0 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
2d500 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
2d510 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
2d520 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
2d530 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20  MemPage.aOvfl[] 
2d540 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
2d550 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
2d560 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
2d570 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
2d580 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
2d590 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
2d5a0 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
2d5b0 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
2d5c0 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
2d5d0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
2d5e0 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
2d5f0 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
2d600 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2d610 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
2d620 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
2d630 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
2d640 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
2d650 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
2d660 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
2d670 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
2d680 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
2d690 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
2d6a0 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
2d6b0 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
2d6c0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
2d6d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
2d6e0 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
2d6f0 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
2d700 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2d710 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
2d720 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
2d730 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
2d740 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
2d750 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
2d760 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
2d770 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2d780 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
2d790 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
2d7a0 20 30 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c   0);.    TESTONL
2d7b0 59 28 69 6e 74 20 72 63 3b 29 0a 20 20 20 20 69  Y(int rc;).    i
2d7c0 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
2d7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2d7e0 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
2d7f0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2d800 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2d810 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2d820 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2d830 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2d840 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2d850 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
2d860 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2d870 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2d880 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2d890 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
2d8a0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2d8b0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2d8c0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2d8d0 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
2d8e0 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
2d8f0 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
2d900 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
2d910 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
2d920 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
2d930 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2d940 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
2d950 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
2d960 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2d970 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2d980 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2d990 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
2d9a0 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2d9b0 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2d9c0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2d9d0 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
2d9e0 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
2d9f0 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
2da00 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
2da10 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2da20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
2da30 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
2da40 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
2da50 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
2da60 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
2da70 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
2da80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2da90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2daa0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2dab0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2dac0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2dad0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2dae0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2daf0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2db00 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2db10 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2db20 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2db30 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2db40 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2db50 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
2db60 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2db70 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2db80 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
2db90 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2dba0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2dbb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2dbc0 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
2dbd0 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
2dbe0 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
2dbf0 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
2dc00 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
2dc10 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
2dc20 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
2dc30 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
2dc40 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
2dc50 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
2dc60 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
2dc70 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
2dc80 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2dc90 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
2dca0 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
2dcb0 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
2dcc0 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
2dcd0 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
2dce0 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
2dcf0 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
2dd00 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
2dd10 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
2dd20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
2dd30 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
2dd40 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
2dd50 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
2dd60 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2dd70 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
2dd80 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
2dd90 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
2dda0 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
2ddb0 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
2ddc0 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
2ddd0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
2dde0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2ddf0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
2de00 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
2de10 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
2de20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
2de30 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
2de40 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
2de50 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
2de60 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
2de70 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
2de80 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2de90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2dea0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
2deb0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
2dec0 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
2ded0 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
2dee0 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
2def0 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
2df00 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
2df10 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2df20 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
2df30 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
2df40 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
2df50 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
2df60 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
2df70 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
2df80 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
2df90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2dfa0 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
2dfb0 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
2dfc0 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
2dfd0 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
2dfe0 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
2dff0 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
2e000 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2e010 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
2e020 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
2e030 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
2e040 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
2e050 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
2e060 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
2e070 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
2e080 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2e090 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2e0a0 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
2e0b0 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
2e0c0 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
2e0d0 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
2e0e0 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
2e0f0 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
2e100 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
2e110 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
2e120 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
2e130 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
2e140 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
2e150 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
2e160 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
2e170 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
2e180 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
2e190 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
2e1a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
2e1b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2e1c0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
2e1d0 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
2e1e0 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
2e1f0 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
2e200 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e  o hold one page.
2e210 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74   If while insert
2e220 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  ing cells into t
2e230 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67  he parent.** pag
2e240 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20  e (pParent) the 
2e250 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
2e260 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
2e270 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  is buffer is.** 
2e280 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2e290 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66  e parent's overf
2e2a0 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75  low cells. Becau
2e2b0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2e2c0 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61   inserts.** a ma
2e2d0 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69  ximum of four di
2e2e0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
2e2f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2e300 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
2e310 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63  m.** size of a c
2e320 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69  ell stored withi
2e330 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
2e340 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73  de is always les
2e350 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66  s than 1/4.** of
2e360 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
2e370 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2e380 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61   buffer is guara
2e390 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
2e3a0 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20  e.** enough for 
2e3b0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  all overflow cel
2e3c0 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76  ls..**.** If aOv
2e3d0 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74  flSpace is set t
2e3e0 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  o a null pointer
2e3f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e400 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2e410 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
2e420 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2e430 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61  nonroot(.  MemPa
2e440 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2e450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e460 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62  rent page of sib
2e470 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61  lings being bala
2e480 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  nced */.  int iP
2e490 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20  arentIdx,       
2e4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2e4b0 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22  ex of "the page"
2e4c0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2e4d0 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c   u8 *aOvflSpace,
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4f0 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79   /* page-size by
2e500 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2e510 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a   parent ovfl */.
2e520 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20    int isRoot    
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e540 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
2e550 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70  rent is a root-p
2e560 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  age */.){.  BtSh
2e570 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2e580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e590 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
2e5a0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
2e5b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e5c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
2e5d0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2e5e0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
2e5f0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
2e600 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
2e610 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
2e620 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
2e630 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
2e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e650 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2e660 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
2e670 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e690 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2e6a0 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
2e6b0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2e6e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
2e710 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
2e720 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
2e730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e740 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
2e750 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2e760 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
2e770 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
2e780 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
2e790 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2e7a0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
2e7b0 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
2e7c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e7d0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2e7e0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
2e7f0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
2e800 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
2e810 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2e820 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
2e830 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
2e840 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
2e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e860 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
2e870 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
2e880 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
2e890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e8a0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
2e8b0 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
2e8c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
2e8d0 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
2e8e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e8f0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
2e900 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
2e910 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
2e920 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
2e930 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
2e940 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
2e950 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
2e960 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
2e970 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
2e980 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
2e990 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
2e9a0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
2e9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
2e9c0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
2e9d0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
2e9e0 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
2e9f0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
2ea00 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
2ea10 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
2ea20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
2ea30 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2ea40 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2ea50 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
2ea60 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
2ea70 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea90 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
2eaa0 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
2eab0 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
2eac0 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
2ead0 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
2eae0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
2eaf0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
2eb00 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
2eb10 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2eb20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
2eb30 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
2eb40 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
2eb50 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
2eb60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2eb70 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
2eb80 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
2eb90 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
2eba0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebc0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
2ebd0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
2ebe0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
2ebf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2ec00 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
2ec10 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2ec20 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
2ec30 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
2ec40 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
2ec50 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
2ec60 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
2ec70 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ec90 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
2eca0 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
2ecb0 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
2ecc0 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
2ecd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ece0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ecf0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ed00 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2ed10 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2ed20 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
2ed30 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
2ed40 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
2ed50 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
2ed60 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2ed70 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
2ed80 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
2ed90 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
2eda0 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
2edb0 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
2edc0 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
2edd0 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
2ede0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
2edf0 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
2ee00 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
2ee10 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
2ee20 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
2ee30 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
2ee40 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
2ee50 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
2ee60 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
2ee70 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
2ee80 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
2ee90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2eea0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2eeb0 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
2eec0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
2eed0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
2eee0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2eef0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2ef00 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
2ef10 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
2ef20 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
2ef30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ef40 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
2ef50 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
2ef60 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
2ef70 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
2ef80 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2ef90 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
2efa0 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
2efb0 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
2efc0 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2efd0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
2efe0 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
2eff0 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
2f000 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2f010 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2f020 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
2f030 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
2f040 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
2f050 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
2f060 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
2f070 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
2f080 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
2f090 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
2f0a0 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
2f0b0 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
2f0c0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2f0d0 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
2f0e0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
2f0f0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
2f100 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
2f110 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
2f120 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
2f130 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
2f140 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
2f150 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
2f160 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2f170 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
2f180 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
2f190 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
2f1a0 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
2f1b0 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
2f1c0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2f1d0 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
2f1e0 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
2f1f0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2f200 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
2f210 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20  }else{.    nOld 
2f220 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61  = 3;.    if( iPa
2f230 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
2f250 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
2f260 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
2f270 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
2f280 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
2f290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f2a0 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
2f2b0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
2f2c0 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20     i = 2;.  }.  
2f2d0 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
2f2e0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2f2f0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2f300 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
2f310 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
2f320 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2f330 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
2f340 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
2f350 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2f360 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
2f370 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
2f380 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
2f390 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
2f3a0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
2f3b0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2f3c0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
2f3d0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2f3e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
2f3f0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
2f400 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
2f410 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
2f420 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2f430 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
2f440 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
2f450 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
2f460 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
2f470 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
2f480 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
2f490 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
2f4a0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
2f4b0 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  dx && pParent->n
2f4c0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2f4d0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
2f4e0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
2f4f0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
2f500 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2f510 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2f520 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2f530 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2f540 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
2f550 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2f560 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2f570 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2f580 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2f590 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2f5a0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2f5b0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
2f5c0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
2f5d0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
2f5e0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2f5f0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2f600 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
2f610 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
2f620 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2f630 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
2f640 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
2f650 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
2f660 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
2f670 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
2f680 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
2f690 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2f6a0 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
2f6b0 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
2f6c0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
2f6d0 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
2f6e0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
2f6f0 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
2f700 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
2f710 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
2f720 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2f730 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2f740 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
2f750 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
2f760 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
2f770 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
2f780 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2f790 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
2f7a0 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
2f7b0 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
2f7c0 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
2f7d0 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
2f7e0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
2f7f0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
2f800 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
2f810 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
2f820 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
2f830 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
2f840 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
2f850 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
2f860 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
2f870 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
2f880 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
2f890 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
2f8a0 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
2f8b0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
2f8c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2f8d0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
2f8e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
2f8f0 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2f900 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2f910 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
2f920 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70  ew[i]);.      ap
2f930 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
2f940 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
2f950 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23  arent->aData];.#
2f960 65 6e 64 69 66 0a 20 20 20 20 20 20 64 72 6f 70  endif.      drop
2f970 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2f980 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2f990 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
2f9a0 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  i], &rc);.    }.
2f9b0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
2f9c0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
2f9d0 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
2f9e0 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
2f9f0 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
2fa00 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
2fa10 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
2fa20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
2fa30 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
2fa40 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
2fa50 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
2fa60 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
2fa70 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
2fa80 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
2fa90 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
2faa0 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
2fab0 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fad0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
2fae0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
2faf0 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb10 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
2fb20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb50 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
2fb60 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fb90 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
2fba0 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
2fbb0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
2fbc0 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
2fbd0 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
2fbe0 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
2fbf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2fc00 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2fc10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2fc20 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2fc30 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
2fc40 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
2fc50 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
2fc60 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
2fc70 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2fc80 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
2fc90 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
2fca0 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
2fcb0 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
2fcc0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
2fcd0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2fce0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
2fcf0 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
2fd00 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
2fd10 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
2fd20 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2fd30 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
2fd40 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
2fd50 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
2fd60 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
2fd70 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
2fd80 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
2fd90 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
2fda0 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
2fdb0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
2fdc0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
2fdd0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
2fde0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
2fdf0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
2fe00 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2fe10 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
2fe20 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
2fe30 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
2fe40 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2fe50 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
2fe60 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
2fe70 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
2fe80 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
2fe90 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
2fea0 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
2feb0 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
2fec0 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
2fed0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2fee0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
2fef0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
2ff00 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
2ff10 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
2ff20 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
2ff30 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
2ff40 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
2ff50 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
2ff60 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
2ff70 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
2ff80 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
2ff90 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
2ffa0 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
2ffb0 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
2ffc0 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
2ffd0 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
2ffe0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2fff0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
30000 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
30010 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
30020 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
30030 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
30040 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
30050 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
30060 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
30070 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
30080 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
30090 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
300a0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
300b0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
300c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
300d0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
300e0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
300f0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
30100 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
30110 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
30120 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
30130 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
30140 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
30150 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
30160 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
30170 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
30180 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
30190 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
301a0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
301b0 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
301c0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
301d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
301e0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
301f0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
30200 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
30210 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
30220 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30230 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
30240 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
30250 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
30260 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
30270 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
30280 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
30290 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
302a0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
302b0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
302c0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
302d0 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
302e0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
302f0 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
30300 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
30310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
30320 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
30330 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
30340 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
30350 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
30360 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
30370 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
30380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
30390 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
303a0 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
303b0 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
303c0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
303d0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
303e0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
303f0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
30400 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
30410 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
30420 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
30430 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
30440 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
30450 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
30460 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
30470 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
30480 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
30490 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
304a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
304b0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
304c0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
304d0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
304e0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
304f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
30500 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
30510 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
30520 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
30530 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
30540 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
30550 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
30560 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
30570 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
30580 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
30590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
305a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
305b0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
305c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
305d0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
305e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
305f0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
30600 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
30610 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
30620 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
30630 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
30640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30650 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
30660 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
30670 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
30680 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
30690 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
306a0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
306b0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
306c0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
306d0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
306e0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
306f0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
30700 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
30710 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
30720 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
30730 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
30740 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
30750 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
30760 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
30770 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
30780 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
30790 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
307a0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
307b0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
307c0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
307d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
307e0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
307f0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
30800 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
30810 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
30820 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
30830 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
30840 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
30850 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
30860 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
30870 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
30880 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
30890 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
308a0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
308b0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
308c0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
308d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
308e0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
308f0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
30900 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
30910 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
30920 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
30930 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
30940 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
30950 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
30960 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
30970 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
30980 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
30990 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
309a0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
309b0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
309c0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
309d0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
309e0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
309f0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
30a00 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
30a10 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
30a20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
30a30 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
30a40 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
30a50 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
30a60 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  RRUPT; goto bala
30a70 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
30a80 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
30a90 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
30aa0 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
30ab0 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
30ac0 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
30ad0 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
30ae0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
30af0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
30b00 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
30b10 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
30b20 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
30b30 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
30b40 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
30b50 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
30b60 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
30b70 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
30b80 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
30b90 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
30ba0 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
30bb0 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
30bc0 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
30bd0 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
30be0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
30bf0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
30c00 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
30c10 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
30c20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
30c30 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
30c40 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
30c50 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
30c60 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
30c70 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
30c80 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
30c90 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
30ca0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
30cb0 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
30cc0 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
30cd0 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
30ce0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
30cf0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
30d00 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
30d10 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
30d20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
30d30 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
30d40 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
30d50 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
30d60 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
30d70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
30d80 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
30d90 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
30da0 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
30db0 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
30dc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30dd0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
30de0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
30df0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
30e00 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
30e10 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
30e20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
30e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
30e40 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30e50 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
30e60 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
30e70 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
30e80 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
30e90 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
30ea0 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
30eb0 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
30ec0 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
30ed0 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
30ee0 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
30ef0 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
30f00 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
30f10 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
30f20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
30f30 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
30f40 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
30f50 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
30f60 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
30f70 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
30f80 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
30f90 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
30fa0 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
30fb0 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
30fc0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
30fd0 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
30fe0 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
30ff0 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
31000 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
31010 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
31020 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
31030 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
31040 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
31050 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
31060 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
31070 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
31080 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
31090 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
310a0 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
310b0 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
310c0 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
310d0 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
310e0 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
310f0 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
31100 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
31110 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
31120 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
31130 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
31140 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
31150 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
31160 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
31170 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
31180 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
31190 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
311a0 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c  pageFlags = apOl
311b0 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  d[0]->aData[0];.
311c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
311d0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
311e0 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
311f0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
31200 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
31210 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
31220 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
31230 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31240 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
31250 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
31260 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
31270 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31280 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
31290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
312a0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
312b0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
312c0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
312d0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c  t, &pNew, &pgno,
312e0 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20   pgno, 0);.     
312f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
31300 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31310 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
31320 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
31330 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
31340 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
31350 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
31360 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
31370 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
31380 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
31390 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
313a0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
313b0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
313c0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
313d0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
313e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
313f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
31400 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
31410 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
31420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
31430 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
31440 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
31450 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
31460 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
31470 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
31480 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
31490 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
314a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
314b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
314c0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
314d0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
314e0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
314f0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
31500 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
31510 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
31520 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
31530 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
31540 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
31550 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
31560 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
31570 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
31580 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
31590 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
315a0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
315b0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
315c0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
315d0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
315e0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
315f0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
31600 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
31610 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
31620 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
31630 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
31640 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
31650 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
31660 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
31670 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
31680 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
31690 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
316a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
316b0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
316c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
316d0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
316e0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
316f0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
31700 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
31710 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
31720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
31730 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
31740 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
31750 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
31760 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
31770 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
31780 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
31790 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
317a0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
317b0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
317c0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
317d0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
317e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
317f0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
31800 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
31810 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
31820 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d      t = apNew[i]
31830 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54  ->pgno;.      pT
31840 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
31850 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
31860 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
31870 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
31880 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
31890 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25  RACE(("new: %d(%
318a0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
318b0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
318c0 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d  ",.    apNew[0]-
318d0 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c  >pgno, szNew[0],
318e0 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61  .    nNew>=2 ? a
318f0 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[1]->pgno : 
31900 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
31910 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
31920 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32  New>=3 ? apNew[2
31930 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
31940 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
31950 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
31960 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e   ? apNew[3]->pgn
31970 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  o : 0, nNew>=4 ?
31980 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
31990 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e     nNew>=5 ? apN
319a0 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[4]->pgno : 0,
319b0 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
319c0 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73  [4] : 0));..  as
319d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
319e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
319f0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
31a00 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52  );.  put4byte(pR
31a10 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  ight, apNew[nNew
31a20 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  -1]->pgno);..  /
31a30 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
31a40 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
31a50 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
31a60 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
31a70 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
31a80 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
31a90 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
31aa0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
31ab0 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
31ac0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
31ad0 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
31ae0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
31af0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
31b00 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
31b10 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
31b20 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
31b30 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
31b40 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
31b50 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
31b60 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
31b70 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
31b80 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
31b90 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
31ba0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
31bb0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
31bc0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
31bd0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
31be0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a  low==0 );..    j
31bf0 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
31c00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
31c10 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
31c20 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
31c30 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
31c40 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
31c50 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
31c60 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
31c70 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
31c80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31c90 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e  i<nNew-1 || j==n
31ca0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
31cb0 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
31cc0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
31cd0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
31ce0 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
31cf0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
31d00 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
31d10 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
31d20 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
31d30 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
31d40 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
31d50 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61  Temp = &aOvflSpa
31d60 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a  ce[iOvflSpace];.
31d70 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
31d80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
31d90 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
31da0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
31db0 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  4);.      }else 
31dc0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
31dd0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
31de0 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
31df0 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
31e00 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
31e10 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
31e20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
31e30 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
31e40 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
31e50 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
31e60 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
31e70 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
31e80 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
31e90 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
31ea0 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
31eb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
31ec0 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
31ed0 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
31ee0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31ef0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
31f00 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
31f10 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
31f20 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
31f30 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
31f40 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
31f50 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
31f60 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72   sz = 4 + putVar
31f70 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69  int(&pCell[4], i
31f80 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20  nfo.nKey);.     
31f90 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
31fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31fb0 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20     pCell -= 4;. 
31fc0 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
31fd0 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
31fe0 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
31ff0 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
32000 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
32010 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
32020 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
32030 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
32040 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
32050 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
32060 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
32070 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
32080 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
32090 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62         ** (see b
320a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
320b0 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
320c0 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
320d0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
320e0 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
320f0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
32100 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
32110 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
32120 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
32130 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
32140 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
32150 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
32160 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
32170 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
32180 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
32190 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
321a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
321b0 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
321c0 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
321d0 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
321e0 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
321f0 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
32200 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
32210 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
32220 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
32230 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
32240 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
32250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
32260 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
32270 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
32280 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
32290 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
322a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
322b0 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65        iOvflSpace
322c0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
322d0 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
322e0 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
322f0 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c     assert( iOvfl
32300 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
32310 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e  Size );.      in
32320 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
32330 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
32340 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d  sz, pTemp, pNew-
32350 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
32360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32370 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
32380 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32390 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
323a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
323b0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
323c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a  age) );..      j
323d0 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
323e0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
323f0 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
32400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
32410 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
32420 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
32430 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
32440 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
32450 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26    u8 *zChild = &
32460 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
32470 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65  aData[8];.    me
32480 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
32490 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a  -1]->aData[8], z
324a0 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a  Child, 4);.  }..
324b0 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20    if( isRoot && 
324c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
324d0 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64  0 && pParent->hd
324e0 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30  rOffset<=apNew[0
324f0 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  ]->nFree ){.    
32500 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
32510 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
32520 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ow contains no c
32530 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73  ells. The only s
32540 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61  ibling.    ** pa
32550 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ge is the right-
32560 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72  child of the par
32570 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  ent. Copy the co
32580 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
32590 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20    ** child page 
325a0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c  into the parent,
325b0 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20   decreasing the 
325c0 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f  overall height o
325d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74  f the.    ** b-t
325e0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79  ree structure by
325f0 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65   one. This is de
32600 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22  scribed as the "
32610 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65  balance-shallowe
32620 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c  r".    ** sub-al
32630 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20  gorithm in some 
32640 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20  documentation.. 
32650 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
32660 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
32670 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
32680 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70   the call to cop
32690 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a  yNodeContent() .
326a0 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20      ** sets all 
326b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
326c0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
326d0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d  g to database im
326e0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
326f0 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  * for which the 
32700 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65  pointer is store
32710 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e  d within the con
32720 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65  tent being copie
32730 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
32740 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65   The second asse
32750 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  rt below verifie
32760 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64  s that the child
32770 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d   page is defragm
32780 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74  ented.    ** (it
32790 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20   must be, as it 
327a0 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74  was just reconst
327b0 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73  ructed using ass
327c0 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68  emblePage()). Th
327d0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70  is.    ** is imp
327e0 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61  ortant if the pa
327f0 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e  rent page happen
32800 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f  s to be page 1 o
32810 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
32820 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f     ** image.  */
32830 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65  .    assert( nNe
32840 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  w==1 );.    asse
32850 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  rt( apNew[0]->nF
32860 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20  ree == .        
32870 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77  (get2byte(&apNew
32880 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61  [0]->aData[5])-a
32890 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66  pNew[0]->cellOff
328a0 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43  set-apNew[0]->nC
328b0 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20  ell*2) .    );. 
328c0 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
328d0 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61  nt(apNew[0], pPa
328e0 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  rent, &rc);.    
328f0 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30  freePage(apNew[0
32900 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65  ], &rc);.  }else
32910 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32920 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20  M ){.    /* Fix 
32930 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
32940 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
32950 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77  the cells that w
32960 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75  ere shifted arou
32970 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72  nd. .    ** Ther
32980 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69  e are several di
32990 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
329a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
329b0 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ries that need t
329c0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  o.    ** be deal
329d0 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72  t with by this r
329e0 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20  outine. Some of 
329f0 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20  these have been 
32a00 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74  set already, but
32a10 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76  .    ** many hav
32a20 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f  e not. The follo
32a30 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72  wing is a summar
32a40 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y:.    **.    **
32a50 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65     1) The entrie
32a60 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32a70 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  h new sibling pa
32a80 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
32a90 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69  t.    **      si
32aa0 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73  blings when this
32ab0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
32ac0 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65  lled. These have
32ad0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
32ae0 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57       been set. W
32af0 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
32b00 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20  worry about old 
32b10 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
32b20 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d  re.    **      m
32b30 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
32b40 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65  -list - the free
32b50 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20  Page() code has 
32b60 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a  taken care.    *
32b70 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e  *      of those.
32b80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32b90 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d   2) The pointer-
32ba0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
32bb0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
32bc0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20  first overflow. 
32bd0 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20     **      page 
32be0 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  in any overflow 
32bf0 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e  chains used by n
32c00 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ew divider cells
32c10 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20  . These .    ** 
32c20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61       have also a
32c30 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65  lready been take
32c40 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65  n care of by the
32c50 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f   insertCell() co
32c60 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
32c70 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69  *   3) If the si
32c80 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
32c90 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
32ca0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
32cb0 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   of.    **      
32cc0 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  cells stored on 
32cd0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
32ce0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
32cf0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
32d00 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20  .    **   4) If 
32d10 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
32d20 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e  s are not intern
32d30 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c  al intkey nodes,
32d40 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a   then any.    **
32d50 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
32d60 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
32d70 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65  se cells may nee
32d80 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a  d to be updated.
32d90 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74      **      (int
32da0 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
32db0 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  es never contain
32dc0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65   pointers to ove
32dd0 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20  rflow pages)..  
32de0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29    **.    **   5)
32df0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
32e00 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
32e10 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70  aves, then the p
32e20 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
32e30 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66  *      entries f
32e40 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  or the right-chi
32e50 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68  ld pages of each
32e60 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65   sibling may nee
32e70 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f  d.    **      to
32e80 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
32e90 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73   **.    ** Cases
32ea0 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61   1 and 2 are dea
32eb0 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79  lt with above by
32ec0 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65   other code. The
32ed0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
32ee0 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61  ck deals with ca
32ef0 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20  ses 3 and 4 and 
32f00 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68  the one after th
32f10 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63  at, case 5. Sinc
32f20 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  e.    ** setting
32f30 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65   a pointer map e
32f40 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69  ntry is a relati
32f50 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f  vely expensive o
32f60 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20  peration, this. 
32f70 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20     ** code only 
32f80 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70  sets pointer map
32f90 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69   entries for chi
32fa0 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
32fb0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
32fc0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d     ** actually m
32fd0 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67  oved between pag
32fe0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  es.  */.    MemP
32ff0 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
33000 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67  w[0];.    MemPag
33010 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
33020 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76  [0];.    int nOv
33030 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
33040 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
33050 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c  t iNextOld = pOl
33060 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72  d->nCell + nOver
33070 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f  flow;.    int iO
33080 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72  verflow = (nOver
33090 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76  flow ? pOld->aOv
330a0 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b  fl[0].idx : -1);
330b0 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20  .    j = 0;     
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330d0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
330e0 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67  nt 'old' sibling
330f0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d   page */.    k =
33100 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33120 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27  /* Current 'new'
33130 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
33140 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
33150 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
33160 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72     int isDivider
33170 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
33180 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29  e( i==iNextOld )
33190 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
331a0 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
331b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
331c0 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
331d0 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20  ell on old.     
331e0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
331f0 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62  ge j. If the sib
33200 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
33210 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
33220 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
33230 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
33240 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64  ll i was a divid
33250 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  er cell. */.    
33260 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70      pOld = apCop
33270 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  y[++j];.        
33280 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21  iNextOld = i + !
33290 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
332a0 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e  >nCell + pOld->n
332b0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
332c0 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
332d0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
332e0 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70     nOverflow = p
332f0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
33300 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
33310 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  low = i + !leafD
33320 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66  ata + pOld->aOvf
33330 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20  l[0].idx;.      
33340 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69    }.        isDi
33350 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74  vider = !leafDat
33360 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  a;  .      }..  
33370 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
33380 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66  flow>0 || iOverf
33390 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61  low<i );.      a
333a0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
333b0 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  2 || pOld->aOvfl
333c0 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [0].idx==pOld->a
333d0 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[1].idx-1);.
333e0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
333f0 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64  erflow<3 || pOld
33400 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d  ->aOvfl[1].idx==
33410 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69  pOld->aOvfl[2].i
33420 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  dx-1);.      if(
33430 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b   i==iOverflow ){
33440 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
33450 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
33460 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77  if( (--nOverflow
33470 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
33480 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20   iOverflow++;.  
33490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
334a0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e  .      if( i==cn
334b0 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20  tNew[k] ){.     
334c0 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
334d0 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
334e0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
334f0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
33500 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  new.        ** s
33510 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49  ibling page k. I
33520 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
33530 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
33540 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
33550 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
33560 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73  , then cell i is
33570 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
33580 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
33590 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a  w = apNew[++k];.
335a0 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61          if( !lea
335b0 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65  fData ) continue
335c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
335d0 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29  assert( j<nOld )
335e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
335f0 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20  k<nNew );..     
33600 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
33610 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64  was originally d
33620 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64  ivider cell (and
33630 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a   is not now) or.
33640 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72        ** an over
33650 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66  flow cell, or if
33660 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f   the cell was lo
33670 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65  cated on a diffe
33680 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20  rent sibling.   
33690 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72     ** page befor
336a0 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  e the balancing,
336b0 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
336c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r map entries as
336d0 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a  sociated.      *
336e0 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64  * with any child
336f0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
33700 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  es need to be up
33710 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  dated.  */.     
33720 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c   if( isDivider |
33730 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e  | pOld->pgno!=pN
33740 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
33750 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
33760 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
33770 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
33780 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43  Bt, get4byte(apC
33790 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f  ell[i]), PTRMAP_
337a0 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
337b0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
337c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
337d0 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d  zCell[i]>pNew->m
337e0 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
337f0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
33800 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
33810 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ll[i], &rc);.   
33820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33830 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c     }..    if( !l
33840 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
33850 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
33860 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
33870 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20        u32 key = 
33880 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b  get4byte(&apNew[
33890 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  i]->aData[8]);. 
338a0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
338b0 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41  (pBt, key, PTRMA
338c0 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
338d0 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  ]->pgno, &rc);. 
338e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
338f0 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  f 0.    /* The p
33900 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
33910 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72  ) contains asser
33920 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
33930 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a  hat verify that.
33940 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74      ** all point
33950 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65  er map pages are
33960 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
33970 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20  This is helpful 
33980 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65  while .    ** de
33990 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73  bugging. This is
339a0 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65   usually disable
339b0 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72  d because a corr
339c0 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  upt database may
339d0 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  .    ** cause an
339e0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
339f0 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f  ent to fail.  */
33a00 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
33a10 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65  Pages(apNew, nNe
33a20 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68  w);.    ptrmapCh
33a30 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e  eckPages(&pParen
33a40 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t, 1);.#endif.  
33a50 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
33a60 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
33a70 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
33a80 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64  E: finished: old
33a90 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
33aa0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
33ab0 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43    nOld, nNew, nC
33ac0 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ell));..  /*.  *
33ad0 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
33ae0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
33af0 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
33b00 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  :.  sqlite3Scrat
33b10 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
33b20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
33b30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
33b40 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
33b50 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
33b60 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
33b70 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
33b80 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
33b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33ba0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
33bb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
33bc0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  when the root pa
33bd0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73  ge of a b-tree s
33be0 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f  tructure is.** o
33bf0 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65  verfull (has one
33c00 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
33c10 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20  w pages)..**.** 
33c20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  A new child page
33c30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
33c40 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
33c50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
33c60 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c  ot.** page, incl
33c70 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63  uding overflow c
33c80 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64  ells, are copied
33c90 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
33ca0 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   The root.** pag
33cb0 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72  e is then overwr
33cc0 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74  itten to make it
33cd0 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
33ce0 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63 68  ith the right-ch
33cf0 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ild .** pointer 
33d00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
33d10 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  new page..**.** 
33d20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
33d30 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  , all pointer-ma
33d40 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
33d50 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73  ponding to pages
33d60 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65   .** that the ne
33d70 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77  w child-page now
33d80 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
33d90 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74 65  rs to are update
33da0 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20  d. The.** entry 
33db0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
33dc0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
33dd0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
33de0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
33df0 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
33e00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
33e10 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20  ssful, *ppChild 
33e20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69  is set to contai
33e30 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
33e40 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70   the child .** p
33e50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
33e60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
33e70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
33e80 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72  caller is requir
33e90 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65  ed.** to call re
33ea0 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a  leasePage() on *
33eb0 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20  ppChild exactly 
33ec0 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  once. If an erro
33ed0 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20  r occurs,.** an 
33ee0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
33ef0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68  turned and *ppCh
33f00 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ild is set to 0.
33f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
33f20 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
33f30 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65  mPage *pRoot, Me
33f40 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29  mPage **ppChild)
33f50 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
33f80 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
33f90 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
33fa0 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20  ge *pChild = 0; 
33fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
33fc0 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
33fd0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
33fe0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
33ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34000 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
34010 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
34020 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
34030 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42  *pBt = pRoot->pB
34040 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72  t;    /* The BTr
34050 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ee */..  assert(
34060 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
34070 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  w>0 );.  assert(
34080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34090 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
340a0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52  );..  /* Make pR
340b0 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61  oot, the root pa
340c0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
340d0 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f  , writable. Allo
340e0 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a  cate a new .  **
340f0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
34100 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72  become the new r
34110 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
34120 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f  age. Copy the co
34130 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ntents.  ** of t
34140 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f  he node stored o
34150 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65  n pRoot into the
34160 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
34170 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
34180 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34190 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
341a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
341b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
341c0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
341d0 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70  e(pBt,&pChild,&p
341e0 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e  gnoChild,pRoot->
341f0 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70  pgno,0);.    cop
34200 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f  yNodeContent(pRo
34210 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29  ot, pChild, &rc)
34220 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
34230 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
34240 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
34250 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50  gnoChild, PTRMAP
34260 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70  _BTREE, pRoot->p
34270 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
34280 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
34290 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  .    *ppChild = 
342a0 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
342b0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
342c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
342d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
342e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
342f0 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
34300 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34310 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34320 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
34330 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
34340 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
34350 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20  l==pRoot->nCell 
34360 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  );..  TRACE(("BA
34370 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
34380 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
34390 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68  pRoot->pgno, pCh
343a0 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20  ild->pgno));..  
343b0 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72  /* Copy the over
343c0 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20  flow cells from 
343d0 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20  pRoot to pChild 
343e0 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  */.  memcpy(pChi
343f0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74  ld->aOvfl, pRoot
34400 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
34410 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
34420 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d  (pRoot->aOvfl[0]
34430 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
34440 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d  verflow = pRoot-
34450 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f  >nOverflow;..  /
34460 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65  * Zero the conte
34470 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68  nts of pRoot. Th
34480 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c  en install pChil
34490 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63  d as the right-c
344a0 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50  hild. */.  zeroP
344b0 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  age(pRoot, pChil
344c0 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
344d0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34  TF_LEAF);.  put4
344e0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
344f0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
34500 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c  set+8], pgnoChil
34510 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20  d);..  *ppChild 
34520 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75  = pChild;.  retu
34530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34540 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
34550 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e  that pCur curren
34560 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  tly points to ha
34570 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69  s just been modi
34580 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20  fied in.** some 
34590 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69  way. This functi
345a0 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69  on figures out i
345b0 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74  f this modificat
345c0 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ion means the.**
345d0 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62   tree needs to b
345e0 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20  e balanced, and 
345f0 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20  if so calls the 
34600 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
34610 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e  ncing .** routin
34620 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75  e. Balancing rou
34630 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  tines are:.**.**
34640 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b     balance_quick
34650 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
34660 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61  deeper().**   ba
34670 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a  lance_nonroot().
34680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
34690 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a  lance(BtCursor *
346a0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCur){.  int rc 
346b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
346c0 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  onst int nMin = 
346d0 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
346e0 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20  eSize * 2 / 3;. 
346f0 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63   u8 aBalanceQuic
34700 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38  kSpace[13];.  u8
34710 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
34720 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61  TESTONLY( int ba
34730 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
34740 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54  ed = 0 );.  TEST
34750 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
34760 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20  e_deeper_called 
34770 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  = 0 );..  do {. 
34780 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
34790 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
347a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
347b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50   pCur->apPage[iP
347c0 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69  age];..    if( i
347d0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
347e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
347f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
34800 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
34810 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
34820 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20  is overfull. In 
34830 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74  this case call t
34840 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  he.        ** ba
34850 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66  lance_deeper() f
34860 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  unction to creat
34870 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f  e a new child fo
34880 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  r the root-page.
34890 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
348a0 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  opy the current 
348b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
348c0 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e  root-page to it.
348d0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
348e0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
348f0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
34900 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63  ll balance the c
34910 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20  hild page..     
34920 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61     */ .        a
34930 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f  ssert( (balance_
34940 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29  deeper_called++)
34950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
34960 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
34970 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d  er(pPage, &pCur-
34980 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20  >apPage[1]);.   
34990 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
349a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
349b0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
349c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
349d0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
349e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  0;.          pCu
349f0 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b  r->aiIdx[1] = 0;
34a00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34a10 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
34a20 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  1]->nOverflow );
34a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34a60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
34a70 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
34a80 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
34a90 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20  <=nMin ){.      
34aa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
34ab0 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
34ac0 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20  * const pParent 
34ad0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
34ae0 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Page-1];.      i
34af0 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20  nt const iIdx = 
34b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
34b10 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  e-1];..      rc 
34b20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34b30 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
34b40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
34b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34b60 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
34b70 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
34b80 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  CE.        if( p
34b90 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20  Page->hasData.  
34ba0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
34bb0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20  >nOverflow==1.  
34bc0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d         && pPage-
34bd0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
34be0 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  Page->nCell.    
34bf0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
34c00 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20  >pgno!=1.       
34c10 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43    && pParent->nC
34c20 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20  ell==iIdx.      
34c30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
34c40 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71  * Call balance_q
34c50 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65  uick() to create
34c60 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f   a new sibling o
34c70 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68  f pPage on which
34c80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
34c90 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66   store the overf
34ca0 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63  low cell. balanc
34cb0 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74  e_quick() insert
34cc0 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20  s a new cell.   
34cd0 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70         ** into p
34ce0 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
34cf0 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
34d00 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69  overflow. If thi
34d10 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
34d20 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74  appens, the next
34d30 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74   interation of t
34d40 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
34d50 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20  balance pParent 
34d60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
34d70 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65  e either balance
34d80 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61  _nonroot() or ba
34d90 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20  lance_deeper(). 
34da0 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20  Until this.     
34db0 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
34dc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
34dd0 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ll is stored in 
34de0 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
34df0 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20  kSpace[].       
34e00 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20     ** buffer. . 
34e10 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
34e20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72        ** The pur
34e30 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  pose of the foll
34e40 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 69  owing assert() i
34e50 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  s to check that 
34e60 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20  only a.         
34e70 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20   ** single call 
34e80 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  to balance_quick
34e90 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65  () is made for e
34ea0 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
34eb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
34ec0 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
34ed0 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65  were not verifie
34ee0 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20  d, a subtle bug 
34ef0 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a  involving reuse.
34f00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
34f10 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63  the aBalanceQuic
34f20 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73  kSpace[] might s
34f30 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20  neak in..       
34f40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
34f50 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
34f60 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29  _quick_called++)
34f70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
34f80 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75   rc = balance_qu
34f90 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ick(pParent, pPa
34fa0 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63  ge, aBalanceQuic
34fb0 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  kSpace);.       
34fc0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
34fd0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
34fe0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
34ff0 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  e, call balance_
35000 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64  nonroot() to red
35010 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a  istribute cells.
35020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74            ** bet
35030 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75  ween pPage and u
35040 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69  p to 2 of its si
35050 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  bling pages. Thi
35060 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20  s involves.     
35070 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e       ** modifyin
35080 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
35090 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  f pParent, which
350a0 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
350b0 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  nt to.          
350c0 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ** become overfu
350d0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
350e0 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   The next iterat
350f0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35100 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  op.          ** 
35110 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65  will balance the
35120 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
35130 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20  correct this..  
35140 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
35150 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
35160 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
35170 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
35180 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
35190 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  or cells.       
351a0 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64     ** are stored
351b0 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20 62   in the pSpace b
351c0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
351d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f  immediately belo
351e0 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  w. .          **
351f0 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74   A subsequent it
35200 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
35210 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c  o-loop will deal
35220 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20 20   with this by.  
35230 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69          ** calli
35240 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ng balance_nonro
35250 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65  ot() (balance_de
35260 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61  eper() may be ca
35270 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20  lled first,.    
35280 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20        ** but it 
35290 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74  doesn't deal wit
352a0 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  h overflow cells
352b0 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68   - just moves th
352c0 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20  em to a.        
352d0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70    ** different p
352e0 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20  age). Once this 
352f0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
35300 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
35310 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20 20  ot() .          
35320 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64  ** has completed
35330 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
35340 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70 61  release the pSpa
35350 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62  ce buffer used b
35360 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  y.          ** t
35370 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c  he previous call
35380 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  , as the overflo
35390 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c  w cell data will
353a0 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20   have been .    
353b0 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
353c0 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20  either into the 
353d0 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62 61  body of a databa
353e0 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20  se page or into 
353f0 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20  the new.        
35400 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66    ** pSpace buff
35410 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  er passed to the
35420 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20   latter call to 
35430 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
35440 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
35450 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 53            u8 *pS
35460 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
35470 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70  geMalloc(pCur->p
35480 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
35490 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
354a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
354b0 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70  arent, iIdx, pSp
354c0 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a  ace, iPage==1);.
354d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 46            if( pF
354e0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ree ){.         
354f0 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69     /* If pFree i
35500 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70  s not NULL, it p
35510 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70  oints to the pSp
35520 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20  ace buffer used 
35530 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
35540 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63 61  by a previous ca
35550 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
35560 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e  nroot(). Its con
35570 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20  tents are.      
35580 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f        ** now sto
35590 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65  red either on re
355a0 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
355b0 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20  s or within the 
355c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
355d0 6e 65 77 20 70 53 70 61 63 65 20 62 75 66 66 65  new pSpace buffe
355e0 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20  r, so it may be 
355f0 73 61 66 65 6c 79 20 66 72 65 65 64 20 68 65 72  safely freed her
35600 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
35610 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
35620 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
35630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
35640 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20 62   /* The pSpace b
35650 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72  uffer will be fr
35660 65 65 64 20 61 66 74 65 72 20 74 68 65 20 6e 65  eed after the ne
35670 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  xt call to.     
35680 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
35690 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75  nonroot(), or ju
356a0 73 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  st before this f
356b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
356c0 20 77 68 69 63 68 65 76 65 72 0a 20 20 20 20 20   whichever.     
356d0 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69       ** comes fi
356e0 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  rst. */.        
356f0 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63 65    pFree = pSpace
35700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35710 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
35720 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
35730 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ..      /* The n
35740 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
35750 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c   the do-loop bal
35760 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e 74  ances the parent
35770 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
35780 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35790 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  e);.      pCur->
357a0 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iPage--;.    }. 
357b0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
357c0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
357d0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71   pFree ){.    sq
357e0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
357f0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
35800 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
35810 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
35820 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
35830 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
35840 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
35850 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
35860 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
35870 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
35880 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
35890 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
358a0 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
358b0 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
358c0 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
358d0 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
358e0 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
358f0 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
35900 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
35910 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
35920 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
35930 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
35940 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
35950 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
35960 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
35970 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
35980 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
35990 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
359a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
359b0 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
359c0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
359d0 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 75  then a successfu
359e0 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76  l call to.** Mov
359f0 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
35a00 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75   seek cursor pCu
35a10 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79  r to (pKey, nKey
35a20 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ) has already.**
35a30 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e   been performed.
35a40 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74   seekResult is t
35a50 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  he search result
35a60 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67   returned (a neg
35a70 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  ative.** number 
35a80 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
35a90 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  t an entry that 
35aa0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
35ab0 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72  (pKey, nKey), or
35ac0 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76  .** a positive v
35ad0 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69  alue if pCur poi
35ae0 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74  nts at an etry t
35af0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
35b00 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b  an .** (pKey, nK
35b10 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ey)). .**.** If 
35b20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
35b30 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
35b40 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
35b50 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
35b60 20 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20   that.** cursor 
35b70 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
35b80 20 61 74 20 74 68 65 20 65 78 69 73 74 69 6e 67   at the existing
35b90 20 63 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74   copy of a row t
35ba0 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20  hat is to be.** 
35bb0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66  overwritten.  If
35bc0 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
35bd0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
35be0 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72  then cursor pCur
35bf0 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   may.** point to
35c00 20 61 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f   any entry or to
35c10 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c   no entry at all
35c20 20 61 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e   and so this fun
35c30 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65  ction has to see
35c40 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  k.** the cursor 
35c50 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b  before the new k
35c60 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74  ey can be insert
35c70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
35c80 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20  e3BtreeInsert(. 
35c90 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cb0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
35cc0 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
35cd0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
35ce0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
35cf0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
35d00 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74   /* The key of t
35d10 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
35d20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
35d30 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
35d40 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66    /* The data of
35d50 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
35d60 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
35d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35d90 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74   extra 0 bytes t
35da0 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
35db0 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
35dc0 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  Bias,           
35dd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35de0 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61  this is likely a
35df0 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  n append */.  in
35e00 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20  t seekResult    
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20  Result of prior 
35e30 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
35e40 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
35e50 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
35e60 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20  = seekResult;   
35e70 20 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65         /* -1: be
35e80 66 6f 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63  fore desired loc
35e90 61 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72  ation  +1: after
35ea0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 20   */.  int szNew 
35eb0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  = 0;.  int idx;.
35ec0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35ed0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
35ee0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
35ef0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
35f00 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
35f10 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
35f20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35f30 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
35f40 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
35f50 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
35f60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
35f70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
35f80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
35f90 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
35fa0 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61  ipNext;.  }..  a
35fb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35fc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35fd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
35fe0 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  >wrFlag && pBt->
35ff0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
36000 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70  RANS_WRITE && !p
36010 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
36020 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
36030 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
36040 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
36050 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
36060 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
36070 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
36080 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62  the caller has b
36090 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20  een consistent. 
360a0 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  If this cursor w
360b0 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65  as opened.  ** e
360c0 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65  xpecting an inde
360d0 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74  x b-tree, then t
360e0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
360f0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c   be inserting bl
36100 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74  ob.  ** keys wit
36110 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  h no associated 
36120 64 61 74 61 2e 20 49 66 20 74 68 65 20 63 75 72  data. If the cur
36130 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65  sor was opened e
36140 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a  xpecting an.  **
36150 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
36160 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
36170 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   be inserting in
36180 74 65 67 65 72 20 6b 65 79 73 20 77 69 74 68 20  teger keys with 
36190 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  a.  ** blob of a
361a0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
361b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
361c0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
361d0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
361e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
361f0 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   an insert into 
36200 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
36210 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
36220 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75  ncrblob .  ** cu
36230 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
36240 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c  e row being repl
36250 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74  aced (assuming t
36260 68 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65  his is a replace
36270 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
36280 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  - if it is not, 
36290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
362a0 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20   a no-op).  */. 
362b0 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49   if( pCur->pKeyI
362c0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nfo==0 ){.    in
362d0 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
362e0 43 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c  Cursors(p, nKey,
362f0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   0);.  }..  /* S
36300 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
36310 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
36320 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
36330 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  his table..  **.
36340 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73    ** In some cas
36350 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  es, the call to 
36360 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65  btreeMoveto() be
36370 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  low is a no-op. 
36380 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65  For.  ** example
36390 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  , when inserting
363a0 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
363b0 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e  le with auto-gen
363c0 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20  erated integer. 
363d0 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44   ** keys, the VD
363e0 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73  BE layer invokes
363f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
36400 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
36410 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65  t the .  ** inte
36420 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20  ger key to use. 
36430 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
36440 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61  is function to a
36450 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74  ctually insert t
36460 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e  he .  ** data in
36470 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d  to the intkey B-
36480 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
36490 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29  se btreeMoveto()
364a0 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a   recognizes.  **
364b0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
364c0 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72   is already wher
364d0 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  e it needs to be
364e0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74   and returns wit
364f0 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  hout.  ** doing 
36500 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f  any work. To avo
36510 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65  id thwarting the
36520 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  se optimizations
36530 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
36540 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c  t.  ** not to cl
36550 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68  ear the cursor h
36560 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ere..  */.  rc =
36570 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
36580 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
36590 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
365a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
365b0 3b 0a 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a  ;.  if( !loc ){.
365c0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f      rc = btreeMo
365d0 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
365e0 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
365f0 73 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66  s, &loc);.    if
36600 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36610 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
36620 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
36630 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
36640 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
36650 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
36660 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
36670 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
36680 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
36690 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
366a0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
366b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
366c0 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
366d0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ge->intKey );.. 
366e0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
366f0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
36700 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
36710 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
36720 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
36730 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
36740 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
36750 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
36760 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
36770 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
36780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
36790 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
367a0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
367b0 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
367c0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
367d0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
367e0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
367f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
36800 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
36810 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
36820 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
36830 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
36840 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
36850 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
36860 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
36870 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
36880 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
36890 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
368a0 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
368b0 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
368c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
368d0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
368e0 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36  oc==0 ){.    u16
368f0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
36900 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
36910 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
36920 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36930 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
36940 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
36950 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
36960 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
36970 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
36980 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
36990 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
369a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
369b0 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
369c0 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
369d0 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
369e0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
369f0 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
36a00 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
36a10 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
36a20 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
36a30 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 2c  age, idx, szOld,
36a40 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
36a50 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
36a60 65 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ert;.  }else if(
36a70 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
36a80 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
36a90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
36aa0 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
36ab0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
36ac0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
36ad0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36ae0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
36af0 0a 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65 6c  .  }.  insertCel
36b00 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65  l(pPage, idx, ne
36b10 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
36b20 20 30 2c 20 26 72 63 29 3b 0a 20 20 61 73 73 65   0, &rc);.  asse
36b30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
36b40 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K || pPage->nCel
36b50 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  l>0 || pPage->nO
36b60 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
36b70 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
36b80 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70  as occured and p
36b90 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72  Page has an over
36ba0 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20  flow cell, call 
36bb0 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20  balance() .  ** 
36bc0 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
36bd0 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  the cells within
36be0 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65   the tree. Since
36bf0 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d   balance() may m
36c00 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
36c10 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74  sor, zero the Bt
36c20 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a  Cursor.info.nSiz
36c30 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76  e and BtCursor.v
36c40 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61  alidNKey.  ** va
36c50 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20  riables..  **.  
36c60 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
36c70 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
36c80 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74  alled moveToRoot
36c90 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63  () to move the c
36ca0 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20  ursor.  ** back 
36cb0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
36cc0 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73   as balance() us
36cd0 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ed to invalidate
36ce0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
36cf0 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61  ** of BtCursor.a
36d00 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75  pPage[] and BtCu
36d10 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e  rsor.aiIdx[]. In
36d20 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74  stead of doing t
36d30 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  hat,.  ** set th
36d40 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
36d50 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69  o "invalid". Thi
36d60 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69  s makes common i
36d70 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
36d80 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66  .  ** slightly f
36d90 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  aster..  **.  **
36da0 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74   There is a subt
36db0 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74  le but important
36dc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65   optimization he
36dd0 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73  re too. When ins
36de0 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74  erting.  ** mult
36df0 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74  iple records int
36e00 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72  o an intkey b-tr
36e10 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ee using a singl
36e20 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e  e cursor (as can
36e30 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69  .  ** happen whi
36e40 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  le processing an
36e50 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
36e60 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d  . SELECT" statem
36e70 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73  ent), it.  ** is
36e80 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f   advantageous to
36e90 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
36ea0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
36eb0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a  e last entry in.
36ec0 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
36ed0 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20  if possible. If 
36ee0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
36ef0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
36f00 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74  he last.  ** ent
36f10 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ry in the table,
36f20 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f   and the next ro
36f30 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61  w inserted has a
36f40 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20  n integer key.  
36f50 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ** larger than t
36f60 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
36f70 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70  ing key, it is p
36f80 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72  ossible to inser
36f90 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77  t the.  ** row w
36fa0 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74  ithout seeking t
36fb0 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20  he cursor. This 
36fc0 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72  can be a big per
36fd0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
36fe0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66    */.  pCur->inf
36ff0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
37000 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
37010 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
37020 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
37030 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
37040 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
37050 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  pCur);..    /* M
37060 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
37070 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
37080 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
37090 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
370a0 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74     ** fails. Int
370b0 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
370c0 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ture corruption 
370d0 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65  will result othe
370e0 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41  rwise. .    ** A
370f0 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72  lso, set the cur
37100 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76  sor state to inv
37110 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73  alid. This stops
37120 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
37130 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f  ion().    ** fro
37140 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  m trying to save
37150 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
37160 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72  ition of the cur
37170 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75  sor.  */.    pCu
37180 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37190 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
371a0 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  w = 0;.    pCur-
371b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
371c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
371d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
371e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
371f0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  ]->nOverflow==0 
37200 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a  );..end_insert:.
37210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37220 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
37230 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
37240 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
37250 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
37260 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
37270 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
37280 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
37290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
372a0 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
372b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
372c0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
372d0 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
372e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
372f0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
37300 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
37310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37320 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37330 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ode */.  MemPage
37340 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
37350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37360 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20   Page to delete 
37370 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  cell from */.  u
37380 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
37390 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
373a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
373b0 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  o cell to delete
373c0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49   */.  int iCellI
373d0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
373e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
373f0 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64  dex of cell to d
37400 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
37410 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20  CellDepth;      
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37430 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65  /* Depth of node
37440 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
37450 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28  l */ ..  assert(
37460 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
37470 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
37480 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
37490 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
374a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
374b0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
374c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
374d0 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
374e0 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
374f0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
37500 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
37510 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
37520 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73  o!=0, 2) );.  as
37530 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
37540 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
37550 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20  >pgnoRoot) );.. 
37560 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
37570 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37580 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
37590 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
375a0 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45  nCell) .   || NE
375b0 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
375c0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  !=CURSOR_VALID).
375d0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
375e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
375f0 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
37600 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20  gone awry. */.  
37610 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
37620 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72  is a delete oper
37630 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20  ation to remove 
37640 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62  a row from a tab
37650 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20  le b-tree,.  ** 
37660 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
37670 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
37680 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
37690 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20  being deleted.  
376a0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
376b0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
376c0 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
376d0 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
376e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20  Cur->info.nKey, 
376f0 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c  0);.  }..  iCell
37700 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50  Depth = pCur->iP
37710 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20  age;.  iCellIdx 
37720 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43  = pCur->aiIdx[iC
37730 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61  ellDepth];.  pPa
37740 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
37750 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  e[iCellDepth];. 
37760 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
37770 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
37780 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  x);..  /* If the
37790 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
377a0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65   the entry to de
377b0 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
377c0 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20  af page, move.  
377d0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ** the cursor to
377e0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
377f0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  ry in the tree t
37800 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  hat is smaller t
37810 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74  han.  ** the ent
37820 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ry being deleted
37830 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c  . This cell will
37840 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
37850 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a  l being deleted.
37860 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
37870 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65  ternal node. The
37880 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72   'previous' entr
37890 79 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  y is used for th
378a0 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  is instead.  ** 
378b0 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e  of the 'next' en
378c0 74 72 79 2c 20 61 73 20 74 68 65 20 70 72 65 76  try, as the prev
378d0 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c  ious entry is al
378e0 77 61 79 73 20 61 20 70 61 72 74 20 6f 66 20 74  ways a part of t
378f0 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65  he.  ** sub-tree
37900 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63   headed by the c
37910 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65  hild page of the
37920 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37930 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a  ted. This makes.
37940 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74    ** balancing t
37950 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e  he tree followin
37960 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65  g the delete ope
37970 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20  ration easier.  
37980 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
37990 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
379a0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 72 63   notUsed;.    rc
379b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
379c0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e  revious(pCur, &n
379d0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
379e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
379f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
37a00 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
37a10 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
37a20 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
37a30 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  table before.  *
37a40 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64  * making any mod
37a50 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65  ifications. Make
37a60 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
37a70 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
37a80 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74  o be .  ** delet
37a90 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65  ed writable. The
37aa0 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66  n free any overf
37ab0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
37ac0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20  ated with the . 
37ad0 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69   ** entry and fi
37ae0 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65  nally remove the
37af0 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f   cell itself fro
37b00 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  m within the pag
37b10 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  e.  .  */.  rc =
37b20 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
37b30 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
37b40 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
37b50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37b60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
37b70 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
37b80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
37b90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37ba0 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  ;.  rc = clearCe
37bb0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
37bc0 3b 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  ;.  dropCell(pPa
37bd0 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65  ge, iCellIdx, ce
37be0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
37bf0 20 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b 0a 20   pCell), &rc);. 
37c00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
37c10 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   rc;..  /* If th
37c20 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77  e cell deleted w
37c30 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f  as not located o
37c40 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  n a leaf page, t
37c50 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20  hen the cursor. 
37c60 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79   ** is currently
37c70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
37c80 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69   largest entry i
37c90 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  n the sub-tree h
37ca0 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eaded.  ** by th
37cb0 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20  e child-page of 
37cc0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61  the cell that wa
37cd0 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66  s just deleted f
37ce0 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a  rom an internal.
37cf0 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63    ** node. The c
37d00 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61  ell from the lea
37d10 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20  f node needs to 
37d20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
37d30 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
37d40 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  de to replace th
37d50 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20  e deleted cell. 
37d60 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
37d70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65  ->leaf ){.    Me
37d80 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70  mPage *pLeaf = p
37d90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
37da0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
37db0 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e  t nCell;.    Pgn
37dc0 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  o n = pCur->apPa
37dd0 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d  ge[iCellDepth+1]
37de0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69  ->pgno;.    unsi
37df0 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b  gned char *pTmp;
37e00 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ..    pCell = fi
37e10 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c  ndCell(pLeaf, pL
37e20 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  eaf->nCell-1);. 
37e30 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53     nCell = cellS
37e40 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43  izePtr(pLeaf, pC
37e50 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ell);.    assert
37e60 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
37e70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20  Bt)>=nCell );.. 
37e80 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
37e90 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70  pace(pBt);.    p
37ea0 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  Tmp = pBt->pTmpS
37eb0 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20  pace;..    rc = 
37ec0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37ed0 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65  e(pLeaf->pDbPage
37ee0 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  );.    insertCel
37ef0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
37f00 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
37f10 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 2c 20 26 72  l+4, pTmp, n, &r
37f20 63 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  c);.    dropCell
37f30 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
37f40 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 2c 20 26  Cell-1, nCell, &
37f50 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
37f60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37f70 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74  ..  /* Balance t
37f80 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20  he tree. If the 
37f90 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61  entry deleted wa
37fa0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  s located on a l
37fb0 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74  eaf page,.  ** t
37fc0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73  hen the cursor s
37fd0 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  till points to t
37fe0 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69  hat page. In thi
37ff0 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74  s case the first
38000 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61  .  ** call to ba
38010 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20  lance() repairs 
38020 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68  the tree, and th
38030 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74  e if(...) condit
38040 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65  ion is.  ** neve
38050 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a  r true..  **.  *
38060 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
38070 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
38080 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65  d was on an inte
38090 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20  rnal node page, 
380a0 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69  then.  ** pCur i
380b0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
380c0 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  e leaf page from
380d0 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61   which a cell wa
380e0 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  s removed to.  *
380f0 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65  * replace the ce
38100 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  ll deleted from 
38110 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
38120 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
38130 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20  tly.  ** tricky 
38140 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  as the leaf node
38150 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c   may be underful
38160 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72  l, and the inter
38170 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a  nal node may.  *
38180 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65  * be either unde
38190 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49  r or overfull. I
381a0 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20  n this case run 
381b0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c  the balancing al
381c0 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20  gorithm.  ** on 
381d0 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69  the leaf node fi
381e0 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61  rst. If the bala
381f0 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72  nce proceeds far
38200 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20   enough up the. 
38210 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65   ** tree that we
38220 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
38230 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e  t any problem in
38240 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
38250 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  de has.  ** been
38260 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62   corrected, so b
38270 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  e it. Otherwise,
38280 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
38290 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a   the leaf node,.
382a0 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75    ** walk the cu
382b0 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65  rsor up the tree
382c0 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
382d0 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63   node and balanc
382e0 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65  e it as .  ** we
382f0 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62  ll.  */.  rc = b
38300 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20  alance(pCur);.  
38310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38320 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  K && pCur->iPage
38330 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20  >iCellDepth ){. 
38340 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
38350 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
38360 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
38370 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
38380 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
38390 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ]);.    }.    rc
383a0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
383b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
383c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
383d0 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
383e0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
383f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
38400 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
38410 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
38420 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
38430 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
38440 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
38450 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
38460 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
38470 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
38480 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
38490 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
384a0 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
384b0 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
384c0 66 20 66 6c 61 67 73 20 61 72 65 2