/ Hex Artifact Content
Login

Artifact 57729cc19f3832e5f9051556af44ed264b5bd54b01543cd7e50d5143817b964c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 61  e for implementa
01a0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 2d 74  tions of the r-t
01b0: 72 65 65 20 61 6e 64 20 72 2a 2d 74 72 65 65 0a  ree and r*-tree.
01c0: 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 73 20 70 61  ** algorithms pa
01d0: 63 6b 61 67 65 64 20 61 73 20 61 6e 20 53 51 4c  ckaged as an SQL
01e0: 69 74 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ite virtual tabl
01f0: 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  e module..*/../*
0200: 0a 2a 2a 20 44 61 74 61 62 61 73 65 20 46 6f 72  .** Database For
0210: 6d 61 74 20 6f 66 20 52 2d 54 72 65 65 20 54 61  mat of R-Tree Ta
0220: 62 6c 65 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  bles.** --------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54  --------.**.** T
0250: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
0260: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 76  e for a single v
0270: 69 72 74 75 61 6c 20 72 2d 74 72 65 65 20 74 61  irtual r-tree ta
0280: 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
0290: 20 74 68 72 65 65 20 0a 2a 2a 20 6e 61 74 69 76   three .** nativ
02a0: 65 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20  e SQLite tables 
02b0: 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c  declared as foll
02c0: 6f 77 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73  ows. In each cas
02d0: 65 2c 20 74 68 65 20 27 25 27 20 63 68 61 72 61  e, the '%' chara
02e0: 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 74  cter.** in the t
02f0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 70  able name is rep
0300: 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20 75  laced with the u
0310: 73 65 72 2d 73 75 70 70 6c 69 65 64 20 6e 61 6d  ser-supplied nam
0320: 65 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 0a  e of the r-tree.
0330: 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ** table..**.** 
0340: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0350: 5f 6e 6f 64 65 28 6e 6f 64 65 6e 6f 20 49 4e 54  _node(nodeno INT
0360: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0370: 2c 20 64 61 74 61 20 42 4c 4f 42 29 0a 2a 2a 20  , data BLOB).** 
0380: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25    CREATE TABLE %
0390: 5f 70 61 72 65 6e 74 28 6e 6f 64 65 6e 6f 20 49  _parent(nodeno I
03a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
03b0: 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64 65 20 49  EY, parentnode I
03c0: 4e 54 45 47 45 52 29 0a 2a 2a 20 20 20 43 52 45  NTEGER).**   CRE
03d0: 41 54 45 20 54 41 42 4c 45 20 25 5f 72 6f 77 69  ATE TABLE %_rowi
03e0: 64 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20  d(rowid INTEGER 
03f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f 64  PRIMARY KEY, nod
0400: 65 6e 6f 20 49 4e 54 45 47 45 52 2c 20 2e 2e 2e  eno INTEGER, ...
0410: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ).**.** The data
0420: 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 6f   for each node o
0430: 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  f the r-tree str
0440: 75 63 74 75 72 65 20 69 73 20 73 74 6f 72 65 64  ucture is stored
0450: 20 69 6e 20 74 68 65 20 25 5f 6e 6f 64 65 0a 2a   in the %_node.*
0460: 2a 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 61 63  * table. For eac
0470: 68 20 6e 6f 64 65 20 74 68 61 74 20 69 73 20 6e  h node that is n
0480: 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ot the root node
0490: 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 2c 20   of the r-tree, 
04a0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 65  there is.** an e
04b0: 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f 70 61  ntry in the %_pa
04c0: 72 65 6e 74 20 74 61 62 6c 65 20 61 73 73 6f 63  rent table assoc
04d0: 69 61 74 69 6e 67 20 74 68 65 20 6e 6f 64 65 20  iating the node 
04e0: 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 2e  with its parent.
04f0: 0a 2a 2a 20 41 6e 64 20 66 6f 72 20 65 61 63 68  .** And for each
0500: 20 72 6f 77 20 6f 66 20 64 61 74 61 20 69 6e 20   row of data in 
0510: 74 68 65 20 74 61 62 6c 65 2c 20 74 68 65 72 65  the table, there
0520: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20   is an entry in 
0530: 74 68 65 20 25 5f 72 6f 77 69 64 0a 2a 2a 20 74  the %_rowid.** t
0540: 61 62 6c 65 20 74 68 61 74 20 6d 61 70 73 20 66  able that maps f
0550: 72 6f 6d 20 74 68 65 20 65 6e 74 72 69 65 73 20  rom the entries 
0560: 72 6f 77 69 64 20 74 6f 20 74 68 65 20 69 64 20  rowid to the id 
0570: 6f 66 20 74 68 65 20 6e 6f 64 65 20 74 68 61 74  of the node that
0580: 20 69 74 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64   it.** is stored
0590: 20 6f 6e 2e 20 20 49 66 20 74 68 65 20 72 2d 74   on.  If the r-t
05a0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 61 75 78  ree contains aux
05b0: 69 6c 69 61 72 79 20 63 6f 6c 75 6d 6e 73 2c 20  iliary columns, 
05c0: 74 68 6f 73 65 20 61 72 65 20 73 74 6f 72 65 64  those are stored
05d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  .** on the end o
05e0: 66 20 74 68 65 20 25 5f 72 6f 77 69 64 20 74 61  f the %_rowid ta
05f0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ble..**.** The r
0600: 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 6e 20 72  oot node of an r
0610: 2d 74 72 65 65 20 61 6c 77 61 79 73 20 65 78 69  -tree always exi
0620: 73 74 73 2c 20 65 76 65 6e 20 69 66 20 74 68 65  sts, even if the
0630: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 69 73   r-tree table is
0640: 0a 2a 2a 20 65 6d 70 74 79 2e 20 54 68 65 20 6e  .** empty. The n
0650: 6f 64 65 6e 6f 20 6f 66 20 74 68 65 20 72 6f 6f  odeno of the roo
0660: 74 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  t node is always
0670: 20 31 2e 20 41 6c 6c 20 6f 74 68 65 72 20 6e 6f   1. All other no
0680: 64 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61  des in the.** ta
0690: 62 6c 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ble must be the 
06a0: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
06b0: 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 54 68 65 20   root node. The 
06c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 65 61 63 68 20  content of each 
06d0: 6e 6f 64 65 0a 2a 2a 20 69 73 20 66 6f 72 6d 61  node.** is forma
06e0: 74 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tted as follows:
06f0: 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 49 66 20 74  .**.**   1. If t
0700: 68 65 20 6e 6f 64 65 20 69 73 20 74 68 65 20 72  he node is the r
0710: 6f 6f 74 20 6e 6f 64 65 20 28 6e 6f 64 65 20 31  oot node (node 1
0720: 29 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  ), then the firs
0730: 74 20 32 20 62 79 74 65 73 0a 2a 2a 20 20 20 20  t 2 bytes.**    
0740: 20 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f    of the node co
0750: 6e 74 61 69 6e 20 74 68 65 20 74 72 65 65 20 64  ntain the tree d
0760: 65 70 74 68 20 61 73 20 61 20 62 69 67 2d 65 6e  epth as a big-en
0770: 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  dian integer..**
0780: 20 20 20 20 20 20 46 6f 72 20 6e 6f 6e 2d 72 6f        For non-ro
0790: 6f 74 20 6e 6f 64 65 73 2c 20 74 68 65 20 66 69  ot nodes, the fi
07a0: 72 73 74 20 32 20 62 79 74 65 73 20 61 72 65 20  rst 2 bytes are 
07b0: 6c 65 66 74 20 75 6e 75 73 65 64 2e 0a 2a 2a 0a  left unused..**.
07c0: 2a 2a 20 20 20 32 2e 20 54 68 65 20 6e 65 78 74  **   2. The next
07d0: 20 32 20 62 79 74 65 73 20 63 6f 6e 74 61 69 6e   2 bytes contain
07e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
07f0: 6e 74 72 69 65 73 20 63 75 72 72 65 6e 74 6c 79  ntries currently
0800: 20 0a 2a 2a 20 20 20 20 20 20 73 74 6f 72 65 64   .**      stored
0810: 20 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2a   in the node..**
0820: 0a 2a 2a 20 20 20 33 2e 20 54 68 65 20 72 65 6d  .**   3. The rem
0830: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6e 6f  ainder of the no
0840: 64 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  de contains the 
0850: 6e 6f 64 65 20 65 6e 74 72 69 65 73 2e 20 45 61  node entries. Ea
0860: 63 68 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  ch entry.**     
0870: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0880: 69 6e 67 6c 65 20 38 2d 62 79 74 65 20 69 6e 74  ingle 8-byte int
0890: 65 67 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  eger followed by
08a0: 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 0a   an even number.
08b0: 2a 2a 20 20 20 20 20 20 6f 66 20 34 2d 62 79 74  **      of 4-byt
08c0: 65 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20 46  e coordinates. F
08d0: 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 20 74 68  or leaf nodes th
08e0: 65 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  e integer is the
08f0: 20 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 6f   rowid.**      o
0900: 66 20 61 20 72 65 63 6f 72 64 2e 20 46 6f 72 20  f a record. For 
0910: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 69  internal nodes i
0920: 74 20 69 73 20 74 68 65 20 6e 6f 64 65 20 6e 75  t is the node nu
0930: 6d 62 65 72 20 6f 66 20 61 0a 2a 2a 20 20 20 20  mber of a.**    
0940: 20 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 2a 2f    child page..*/
0950: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0960: 51 4c 49 54 45 5f 43 4f 52 45 29 20 5c 0a 20 20  QLITE_CORE) \.  
0970: 7c 7c 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49  || (defined(SQLI
0980: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 29  TE_ENABLE_RTREE)
0990: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
09a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
09b0: 54 41 42 4c 45 29 29 0a 0a 23 69 66 6e 64 65 66  TABLE))..#ifndef
09c0: 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 23   SQLITE_CORE.  #
09d0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
09e0: 65 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f  ext.h".  SQLITE_
09f0: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0a00: 23 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65  #else.  #include
0a10: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e   "sqlite3.h".#en
0a20: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  dif..#include <s
0a30: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0a40: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e  e <assert.h>.#in
0a50: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0a60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0a70: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 69 6e  AMALGAMATION.#in
0a80: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 72 74  clude "sqlite3rt
0a90: 72 65 65 2e 68 22 0a 74 79 70 65 64 65 66 20 73  ree.h".typedef s
0aa0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
0ab0: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
0ac0: 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79  3_uint64 u64;.ty
0ad0: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
0ae0: 68 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20  har u8;.typedef 
0af0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 75  unsigned short u
0b00: 31 36 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69  16;.typedef unsi
0b10: 67 6e 65 64 20 69 6e 74 20 75 33 32 3b 0a 23 65  gned int u32;.#e
0b20: 6e 64 69 66 0a 0a 2f 2a 20 20 54 68 65 20 66 6f  ndif../*  The fo
0b30: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 69 73  llowing macro is
0b40: 20 75 73 65 64 20 74 6f 20 73 75 70 70 72 65 73   used to suppres
0b50: 73 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  s compiler warni
0b60: 6e 67 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ngs..*/.#ifndef 
0b70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0b80: 0a 23 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44  .# define UNUSED
0b90: 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76  _PARAMETER(x) (v
0ba0: 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a  oid)(x).#endif..
0bb0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52  typedef struct R
0bc0: 74 72 65 65 20 52 74 72 65 65 3b 0a 74 79 70 65  tree Rtree;.type
0bd0: 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
0be0: 43 75 72 73 6f 72 20 52 74 72 65 65 43 75 72 73  Cursor RtreeCurs
0bf0: 6f 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  or;.typedef stru
0c00: 63 74 20 52 74 72 65 65 4e 6f 64 65 20 52 74 72  ct RtreeNode Rtr
0c10: 65 65 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66 20  eeNode;.typedef 
0c20: 73 74 72 75 63 74 20 52 74 72 65 65 43 65 6c 6c  struct RtreeCell
0c30: 20 52 74 72 65 65 43 65 6c 6c 3b 0a 74 79 70 65   RtreeCell;.type
0c40: 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
0c50: 43 6f 6e 73 74 72 61 69 6e 74 20 52 74 72 65 65  Constraint Rtree
0c60: 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 74 79 70 65  Constraint;.type
0c70: 64 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65  def struct Rtree
0c80: 4d 61 74 63 68 41 72 67 20 52 74 72 65 65 4d 61  MatchArg RtreeMa
0c90: 74 63 68 41 72 67 3b 0a 74 79 70 65 64 65 66 20  tchArg;.typedef 
0ca0: 73 74 72 75 63 74 20 52 74 72 65 65 47 65 6f 6d  struct RtreeGeom
0cb0: 43 61 6c 6c 62 61 63 6b 20 52 74 72 65 65 47 65  Callback RtreeGe
0cc0: 6f 6d 43 61 6c 6c 62 61 63 6b 3b 0a 74 79 70 65  omCallback;.type
0cd0: 64 65 66 20 75 6e 69 6f 6e 20 52 74 72 65 65 43  def union RtreeC
0ce0: 6f 6f 72 64 20 52 74 72 65 65 43 6f 6f 72 64 3b  oord RtreeCoord;
0cf0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0d00: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
0d10: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
0d20: 74 3b 0a 0a 2f 2a 20 54 68 65 20 72 74 72 65 65  t;../* The rtree
0d30: 20 6d 61 79 20 68 61 76 65 20 62 65 74 77 65 65   may have betwee
0d40: 6e 20 31 20 61 6e 64 20 52 54 52 45 45 5f 4d 41  n 1 and RTREE_MA
0d50: 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 20 64 69 6d  X_DIMENSIONS dim
0d60: 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 23 64 65 66  ensions. */.#def
0d70: 69 6e 65 20 52 54 52 45 45 5f 4d 41 58 5f 44 49  ine RTREE_MAX_DI
0d80: 4d 45 4e 53 49 4f 4e 53 20 35 0a 0a 2f 2a 20 4d  MENSIONS 5../* M
0d90: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
0da0: 20 61 75 78 69 6c 69 61 72 79 20 63 6f 6c 75 6d   auxiliary colum
0db0: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  ns */.#define RT
0dc0: 52 45 45 5f 4d 41 58 5f 41 55 58 5f 43 4f 4c 55  REE_MAX_AUX_COLU
0dd0: 4d 4e 20 31 30 30 0a 0a 2f 2a 20 53 69 7a 65 20  MN 100../* Size 
0de0: 6f 66 20 68 61 73 68 20 74 61 62 6c 65 20 52 74  of hash table Rt
0df0: 72 65 65 2e 61 48 61 73 68 2e 20 54 68 69 73 20  ree.aHash. This 
0e00: 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 6e 6f  hash table is no
0e10: 74 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a  t expected to.**
0e20: 20 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 76 65   ever contain ve
0e30: 72 79 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 2c  ry many entries,
0e40: 20 73 6f 20 61 20 66 69 78 65 64 20 6e 75 6d 62   so a fixed numb
0e50: 65 72 20 6f 66 20 62 75 63 6b 65 74 73 20 69 73  er of buckets is
0e60: 20 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 23 64   .** used..*/.#d
0e70: 65 66 69 6e 65 20 48 41 53 48 53 49 5a 45 20 39  efine HASHSIZE 9
0e80: 37 0a 0a 2f 2a 20 54 68 65 20 78 42 65 73 74 49  7../* The xBestI
0e90: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
0ea0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
0eb0: 65 20 72 65 71 75 69 72 65 73 20 61 6e 20 65 73  e requires an es
0ec0: 74 69 6d 61 74 65 20 6f 66 0a 2a 2a 20 74 68 65  timate of.** the
0ed0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0ee0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  in the virtual t
0ef0: 61 62 6c 65 20 74 6f 20 63 61 6c 63 75 6c 61 74  able to calculat
0f00: 65 20 74 68 65 20 63 6f 73 74 73 20 6f 66 0a 2a  e the costs of.*
0f10: 2a 20 76 61 72 69 6f 75 73 20 73 74 72 61 74 65  * various strate
0f20: 67 69 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  gies. If possibl
0f30: 65 2c 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  e, this estimate
0f40: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
0f50: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74  the.** sqlite_st
0f60: 61 74 31 20 74 61 62 6c 65 20 28 77 69 74 68 20  at1 table (with 
0f70: 52 54 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54  RTREE_MIN_ROWEST
0f80: 20 61 73 20 61 20 68 61 72 64 2d 63 6f 64 65 64   as a hard-coded
0f90: 20 6d 69 6e 69 6d 75 6d 29 2e 0a 2a 2a 20 4f 74   minimum)..** Ot
0fa0: 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 73  herwise, if no s
0fb0: 71 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72  qlite_stat1 entr
0fc0: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  y is available, 
0fd0: 75 73 65 20 0a 2a 2a 20 52 54 52 45 45 5f 44 45  use .** RTREE_DE
0fe0: 46 41 55 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f  FAULT_ROWEST..*/
0ff0: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44  .#define RTREE_D
1000: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 20 31 30  EFAULT_ROWEST 10
1010: 34 38 35 37 36 0a 23 64 65 66 69 6e 65 20 52 54  48576.#define RT
1020: 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 20  REE_MIN_ROWEST  
1030: 20 20 20 20 20 20 20 31 30 30 0a 0a 2f 2a 20 0a         100../* .
1040: 2a 2a 20 41 6e 20 72 74 72 65 65 20 76 69 72 74  ** An rtree virt
1050: 75 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual-table object
1060: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65  ..*/.struct Rtre
1070: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  e {.  sqlite3_vt
1080: 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
1090: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e    /* Base class.
10a0: 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
10b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d0: 20 2f 2a 20 48 6f 73 74 20 64 61 74 61 62 61 73   /* Host databas
10e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
10f0: 20 20 69 6e 74 20 69 4e 6f 64 65 53 69 7a 65 3b    int iNodeSize;
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1110: 20 53 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   Size in bytes o
1120: 66 20 65 61 63 68 20 6e 6f 64 65 20 69 6e 20 74  f each node in t
1130: 68 65 20 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f  he node table */
1140: 0a 20 20 75 38 20 6e 44 69 6d 3b 20 20 20 20 20  .  u8 nDim;     
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 6d 65  * Number of dime
1170: 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 6e  nsions */.  u8 n
1180: 44 69 6d 32 3b 20 20 20 20 20 20 20 20 20 20 20  Dim2;           
1190: 20 20 20 20 20 20 20 20 2f 2a 20 54 77 69 63 65          /* Twice
11a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
11b0: 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20 75  imensions */.  u
11c0: 38 20 65 43 6f 6f 72 64 54 79 70 65 3b 20 20 20  8 eCoordType;   
11d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 54             /* RT
11e0: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
11f0: 20 6f 72 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f   or RTREE_COORD_
1200: 49 4e 54 33 32 20 2a 2f 0a 20 20 75 38 20 6e 42  INT32 */.  u8 nB
1210: 79 74 65 73 50 65 72 43 65 6c 6c 3b 20 20 20 20  ytesPerCell;    
1220: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1230: 63 6f 6e 73 75 6d 65 64 20 70 65 72 20 63 65 6c  consumed per cel
1240: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 57 72 54 72  l */.  u8 inWrTr
1250: 61 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ans;            
1260: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
1270: 73 69 64 65 20 77 72 69 74 65 20 74 72 61 6e 73  side write trans
1280: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  action */.  u8 n
1290: 41 75 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aux;            
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 23 20 6f 66 20          /* # of 
12b0: 61 75 78 69 6c 69 61 72 79 20 63 6f 6c 75 6d 6e  auxiliary column
12c0: 73 20 69 6e 20 25 5f 72 6f 77 69 64 20 2a 2f 0a  s in %_rowid */.
12d0: 20 20 75 38 20 6e 41 75 78 4e 6f 74 4e 75 6c 6c    u8 nAuxNotNull
12e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12f0: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69   Number of initi
1300: 61 6c 20 6e 6f 74 2d 6e 75 6c 6c 20 61 75 78 20  al not-null aux 
1310: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 64 65  columns */.#ifde
1320: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1330: 20 75 38 20 62 43 6f 72 72 75 70 74 3b 20 20 20   u8 bCorrupt;   
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1350: 53 68 61 64 6f 77 20 74 61 62 6c 65 20 63 6f 72  Shadow table cor
1360: 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64  ruption detected
1370: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
1380: 20 69 44 65 70 74 68 3b 20 20 20 20 20 20 20 20   iDepth;        
1390: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
13a0: 65 6e 74 20 64 65 70 74 68 20 6f 66 20 74 68 65  ent depth of the
13b0: 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
13c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
13d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
13f0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1400: 67 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a  g r-tree table *
1410: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 2d 74 72 65  /* Name of r-tre
1440: 65 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 75 33  e table */ .  u3
1450: 32 20 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20  2 nBusy;        
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1470: 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 75  rent number of u
1480: 73 65 72 73 20 6f 66 20 74 68 69 73 20 73 74 72  sers of this str
1490: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 36 34 20  ucture */.  i64 
14a0: 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20  nRowEst;        
14b0: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
14c0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
14d0: 6f 77 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  ows in this tabl
14e0: 65 20 2a 2f 0a 20 20 75 33 32 20 6e 43 75 72 73  e */.  u32 nCurs
14f0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
1500: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1510: 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f 0a  open cursors */.
1520: 20 20 75 33 32 20 6e 4e 6f 64 65 52 65 66 3b 20    u32 nNodeRef; 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 4e 75 6d 62 65 72 20 52 74 72 65 65 4e 6f 64   Number RtreeNod
1550: 65 73 20 77 69 74 68 20 70 6f 73 69 74 69 76 65  es with positive
1560: 20 6e 52 65 66 20 2a 2f 0a 20 20 63 68 61 72 20   nRef */.  char 
1570: 2a 7a 52 65 61 64 41 75 78 53 71 6c 3b 20 20 20  *zReadAuxSql;   
1580: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 6f         /* SQL fo
1590: 72 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  r statement to r
15a0: 65 61 64 20 61 75 78 20 64 61 74 61 20 2a 2f 0a  ead aux data */.
15b0: 0a 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 6f  .  /* List of no
15c0: 64 65 73 20 72 65 6d 6f 76 65 64 20 64 75 72 69  des removed duri
15d0: 6e 67 20 61 20 43 6f 6e 64 65 6e 73 65 54 72 65  ng a CondenseTre
15e0: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4c 69 73  e operation. Lis
15f0: 74 20 69 73 0a 20 20 2a 2a 20 6c 69 6e 6b 65 64  t is.  ** linked
1600: 20 74 6f 67 65 74 68 65 72 20 76 69 61 20 74 68   together via th
1610: 65 20 70 6f 69 6e 74 65 72 20 6e 6f 72 6d 61 6c  e pointer normal
1620: 6c 79 20 75 73 65 64 20 66 6f 72 20 68 61 73 68  ly used for hash
1630: 20 63 68 61 69 6e 73 20 2d 0a 20 20 2a 2a 20 52   chains -.  ** R
1640: 74 72 65 65 4e 6f 64 65 2e 70 4e 65 78 74 2e 20  treeNode.pNext. 
1650: 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f 64 65 20  RtreeNode.iNode 
1660: 73 74 6f 72 65 73 20 74 68 65 20 64 65 70 74 68  stores the depth
1670: 20 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65   of the sub-tree
1680: 20 0a 20 20 2a 2a 20 68 65 61 64 65 64 20 62 79   .  ** headed by
1690: 20 74 68 65 20 6e 6f 64 65 20 28 6c 65 61 66 20   the node (leaf 
16a0: 6e 6f 64 65 73 20 68 61 76 65 20 52 74 72 65 65  nodes have Rtree
16b0: 4e 6f 64 65 2e 69 4e 6f 64 65 3d 3d 30 29 2e 0a  Node.iNode==0)..
16c0: 20 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65    */.  RtreeNode
16d0: 20 2a 70 44 65 6c 65 74 65 64 3b 0a 20 20 69 6e   *pDeleted;.  in
16e0: 74 20 69 52 65 69 6e 73 65 72 74 48 65 69 67 68  t iReinsertHeigh
16f0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69  t;        /* Hei
1700: 67 68 74 20 6f 66 20 73 75 62 2d 74 72 65 65 73  ght of sub-trees
1710: 20 52 65 69 6e 73 65 72 74 28 29 20 68 61 73 20   Reinsert() has 
1720: 72 75 6e 20 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  run on */..  /* 
1730: 42 6c 6f 62 20 49 2f 4f 20 6f 6e 20 78 78 78 5f  Blob I/O on xxx_
1740: 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1750: 33 5f 62 6c 6f 62 20 2a 70 4e 6f 64 65 42 6c 6f  3_blob *pNodeBlo
1760: 62 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65  b;..  /* Stateme
1770: 6e 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74  nts to read/writ
1780: 65 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72  e/delete a recor
1790: 64 20 66 72 6f 6d 20 78 78 78 5f 6e 6f 64 65 20  d from xxx_node 
17a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
17b0: 74 20 2a 70 57 72 69 74 65 4e 6f 64 65 3b 0a 20  t *pWriteNode;. 
17c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17d0: 44 65 6c 65 74 65 4e 6f 64 65 3b 0a 0a 20 20 2f  DeleteNode;..  /
17e0: 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * Statements to 
17f0: 72 65 61 64 2f 77 72 69 74 65 2f 64 65 6c 65 74  read/write/delet
1800: 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  e a record from 
1810: 78 78 78 5f 72 6f 77 69 64 20 2a 2f 0a 20 20 73  xxx_rowid */.  s
1820: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65  qlite3_stmt *pRe
1830: 61 64 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74  adRowid;.  sqlit
1840: 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 52  e3_stmt *pWriteR
1850: 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  owid;.  sqlite3_
1860: 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 52 6f 77  stmt *pDeleteRow
1870: 69 64 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d  id;..  /* Statem
1880: 65 6e 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69  ents to read/wri
1890: 74 65 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f  te/delete a reco
18a0: 72 64 20 66 72 6f 6d 20 78 78 78 5f 70 61 72 65  rd from xxx_pare
18b0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
18c0: 73 74 6d 74 20 2a 70 52 65 61 64 50 61 72 65 6e  stmt *pReadParen
18d0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  t;.  sqlite3_stm
18e0: 74 20 2a 70 57 72 69 74 65 50 61 72 65 6e 74 3b  t *pWriteParent;
18f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1900: 2a 70 44 65 6c 65 74 65 50 61 72 65 6e 74 3b 0a  *pDeleteParent;.
1910: 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20  .  /* Statement 
1920: 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74  for writing to t
1930: 68 65 20 22 61 75 78 3a 22 20 66 69 65 6c 64 73  he "aux:" fields
1940: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  , if there are a
1950: 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ny */.  sqlite3_
1960: 73 74 6d 74 20 2a 70 57 72 69 74 65 41 75 78 3b  stmt *pWriteAux;
1970: 0a 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 61  ..  RtreeNode *a
1980: 48 61 73 68 5b 48 41 53 48 53 49 5a 45 5d 3b 20  Hash[HASHSIZE]; 
1990: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
19a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6e 6f 64 65 73   in-memory nodes
19b0: 2e 20 2a 2f 20 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73  . */ .};../* Pos
19c0: 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72  sible values for
19d0: 20 52 74 72 65 65 2e 65 43 6f 6f 72 64 54 79 70   Rtree.eCoordTyp
19e0: 65 3a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  e: */.#define RT
19f0: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
1a00: 20 30 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45   0.#define RTREE
1a10: 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 20 31 0a  _COORD_INT32  1.
1a20: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
1a30: 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 20  _RTREE_INT_ONLY 
1a40: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
1a50: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
1a60: 62 6c 65 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c 79  ble will.** only
1a70: 20 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65 67   deal with integ
1a80: 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 20  er coordinates. 
1a90: 20 4e 6f 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   No floating poi
1aa0: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a  nt operations.**
1ab0: 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 0a 2a   will be done..*
1ac0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ad0: 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20  RTREE_INT_ONLY. 
1ae0: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
1af0: 5f 69 6e 74 36 34 20 52 74 72 65 65 44 56 61 6c  _int64 RtreeDVal
1b00: 75 65 3b 20 20 20 20 20 20 20 2f 2a 20 48 69 67  ue;       /* Hig
1b10: 68 20 61 63 63 75 72 61 63 79 20 63 6f 6f 72 64  h accuracy coord
1b20: 69 6e 61 74 65 20 2a 2f 0a 20 20 74 79 70 65 64  inate */.  typed
1b30: 65 66 20 69 6e 74 20 52 74 72 65 65 56 61 6c 75  ef int RtreeValu
1b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b50: 20 20 20 20 2f 2a 20 4c 6f 77 20 61 63 63 75 72      /* Low accur
1b60: 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20 2a  acy coordinate *
1b70: 2f 0a 23 20 64 65 66 69 6e 65 20 52 54 52 45 45  /.# define RTREE
1b80: 5f 5a 45 52 4f 20 30 0a 23 65 6c 73 65 0a 20 20  _ZERO 0.#else.  
1b90: 74 79 70 65 64 65 66 20 64 6f 75 62 6c 65 20 52  typedef double R
1ba0: 74 72 65 65 44 56 61 6c 75 65 3b 20 20 20 20 20  treeDValue;     
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68           /* High
1bc0: 20 61 63 63 75 72 61 63 79 20 63 6f 6f 72 64 69   accuracy coordi
1bd0: 6e 61 74 65 20 2a 2f 0a 20 20 74 79 70 65 64 65  nate */.  typede
1be0: 66 20 66 6c 6f 61 74 20 52 74 72 65 65 56 61 6c  f float RtreeVal
1bf0: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
1c00: 20 20 20 2f 2a 20 4c 6f 77 20 61 63 63 75 72 61     /* Low accura
1c10: 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20 2a 2f  cy coordinate */
1c20: 0a 23 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f  .# define RTREE_
1c30: 5a 45 52 4f 20 30 2e 30 0a 23 65 6e 64 69 66 0a  ZERO 0.0.#endif.
1c40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 52  ./*.** Set the R
1c50: 74 72 65 65 2e 62 43 6f 72 72 75 70 74 20 66 6c  tree.bCorrupt fl
1c60: 61 67 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ag.*/.#ifdef SQL
1c70: 49 54 45 5f 44 45 42 55 47 0a 23 20 64 65 66 69  ITE_DEBUG.# defi
1c80: 6e 65 20 52 54 52 45 45 5f 49 53 5f 43 4f 52 52  ne RTREE_IS_CORR
1c90: 55 50 54 28 58 29 20 28 28 58 29 2d 3e 62 43 6f  UPT(X) ((X)->bCo
1ca0: 72 72 75 70 74 20 3d 20 31 29 0a 23 65 6c 73 65  rrupt = 1).#else
1cb0: 0a 23 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f  .# define RTREE_
1cc0: 49 53 5f 43 4f 52 52 55 50 54 28 58 29 0a 23 65  IS_CORRUPT(X).#e
1cd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
1ce0: 20 64 6f 69 6e 67 20 61 20 73 65 61 72 63 68 20   doing a search 
1cf0: 6f 66 20 61 6e 20 72 2d 74 72 65 65 2c 20 69 6e  of an r-tree, in
1d00: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66  stances of the f
1d10: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1d20: 72 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  re.** record int
1d30: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1d40: 73 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 20  s from the tree 
1d50: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  walk..**.** The 
1d60: 69 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e  id is always a n
1d70: 6f 64 65 2d 69 64 2e 20 20 46 6f 72 20 69 4c 65  ode-id.  For iLe
1d80: 76 65 6c 3e 3d 31 20 74 68 65 20 69 64 20 69 73  vel>=1 the id is
1d90: 20 74 68 65 20 6e 6f 64 65 2d 69 64 20 6f 66 0a   the node-id of.
1da0: 2a 2a 20 74 68 65 20 6e 6f 64 65 20 74 68 61 74  ** the node that
1db0: 20 74 68 65 20 52 74 72 65 65 53 65 61 72 63 68   the RtreeSearch
1dc0: 50 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 73  Point represents
1dd0: 2e 20 20 57 68 65 6e 20 69 4c 65 76 65 6c 3d 3d  .  When iLevel==
1de0: 30 2c 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  0, however,.** t
1df0: 68 65 20 69 64 20 69 73 20 6f 66 20 74 68 65 20  he id is of the 
1e00: 70 61 72 65 6e 74 20 6e 6f 64 65 20 61 6e 64 20  parent node and 
1e10: 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 52 74  the cell that Rt
1e20: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 0a 2a  reeSearchPoint.*
1e30: 2a 20 72 65 70 72 65 73 65 6e 74 73 20 69 73 20  * represents is 
1e40: 74 68 65 20 69 43 65 6c 6c 2d 74 68 20 65 6e 74  the iCell-th ent
1e50: 72 79 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ry in the parent
1e60: 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   node..*/.struct
1e70: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
1e80: 74 20 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  t {.  RtreeDValu
1e90: 65 20 72 53 63 6f 72 65 3b 20 20 20 20 2f 2a 20  e rScore;    /* 
1ea0: 54 68 65 20 73 63 6f 72 65 20 66 6f 72 20 74 68  The score for th
1eb0: 69 73 20 6e 6f 64 65 2e 20 20 53 6d 61 6c 6c 65  is node.  Smalle
1ec0: 73 74 20 67 6f 65 73 20 66 69 72 73 74 2e 20 2a  st goes first. *
1ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1ee0: 34 20 69 64 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  4 id;      /* No
1ef0: 64 65 20 49 44 20 2a 2f 0a 20 20 75 38 20 69 4c  de ID */.  u8 iL
1f00: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
1f10: 20 20 2f 2a 20 30 3d 65 6e 74 72 69 65 73 2e 20    /* 0=entries. 
1f20: 20 31 3d 6c 65 61 66 20 6e 6f 64 65 2e 20 20 32   1=leaf node.  2
1f30: 2b 20 66 6f 72 20 68 69 67 68 65 72 20 2a 2f 0a  + for higher */.
1f40: 20 20 75 38 20 65 57 69 74 68 69 6e 3b 20 20 20    u8 eWithin;   
1f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 52 54           /* PART
1f60: 4c 59 5f 57 49 54 48 49 4e 20 6f 72 20 46 55 4c  LY_WITHIN or FUL
1f70: 4c 59 5f 57 49 54 48 49 4e 20 2a 2f 0a 20 20 75  LY_WITHIN */.  u
1f80: 38 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  8 iCell;        
1f90: 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 6e        /* Cell in
1fa0: 64 65 78 20 77 69 74 68 69 6e 20 74 68 65 20 6e  dex within the n
1fb0: 6f 64 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ode */.};../*.**
1fc0: 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d   The minimum num
1fd0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 6c 6c  ber of cells all
1fe0: 6f 77 65 64 20 66 6f 72 20 61 20 6e 6f 64 65 20  owed for a node 
1ff0: 69 73 20 61 20 74 68 69 72 64 20 6f 66 20 74 68  is a third of th
2000: 65 20 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 49  e .** maximum. I
2010: 6e 20 47 75 74 6d 61 6e 27 73 20 6e 6f 74 61 74  n Gutman's notat
2020: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6d  ion:.**.**     m
2030: 20 3d 20 4d 2f 33 0a 2a 2a 0a 2a 2a 20 49 66 20   = M/3.**.** If 
2040: 61 6e 20 52 2a 2d 74 72 65 65 20 22 52 65 69 6e  an R*-tree "Rein
2050: 73 65 72 74 22 20 6f 70 65 72 61 74 69 6f 6e 20  sert" operation 
2060: 69 73 20 72 65 71 75 69 72 65 64 2c 20 74 68 65  is required, the
2070: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 0a   same number of.
2080: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 72 65 6d  ** cells are rem
2090: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 76  oved from the ov
20a0: 65 72 66 75 6c 6c 20 6e 6f 64 65 20 61 6e 64 20  erfull node and 
20b0: 72 65 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  reinserted into 
20c0: 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 23 64 65  the tree..*/.#de
20d0: 66 69 6e 65 20 52 54 52 45 45 5f 4d 49 4e 43 45  fine RTREE_MINCE
20e0: 4c 4c 53 28 70 29 20 28 28 28 28 70 29 2d 3e 69  LLS(p) ((((p)->i
20f0: 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 28 70 29 2d  NodeSize-4)/(p)-
2100: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 29 2f  >nBytesPerCell)/
2110: 33 29 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  3).#define RTREE
2120: 5f 52 45 49 4e 53 45 52 54 28 70 29 20 52 54 52  _REINSERT(p) RTR
2130: 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 29 0a 23  EE_MINCELLS(p).#
2140: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58  define RTREE_MAX
2150: 43 45 4c 4c 53 20 35 31 0a 0a 2f 2a 0a 2a 2a 20  CELLS 51../*.** 
2160: 54 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  The smallest pos
2170: 73 69 62 6c 65 20 6e 6f 64 65 2d 73 69 7a 65 20  sible node-size 
2180: 69 73 20 28 35 31 32 2d 36 34 29 3d 3d 34 34 38  is (512-64)==448
2190: 20 62 79 74 65 73 2e 20 41 6e 64 20 74 68 65 20   bytes. And the 
21a0: 6c 61 72 67 65 73 74 0a 2a 2a 20 73 75 70 70 6f  largest.** suppo
21b0: 72 74 65 64 20 63 65 6c 6c 20 73 69 7a 65 20 69  rted cell size i
21c0: 73 20 34 38 20 62 79 74 65 73 20 28 38 20 62 79  s 48 bytes (8 by
21d0: 74 65 20 72 6f 77 69 64 20 2b 20 74 65 6e 20 34  te rowid + ten 4
21e0: 20 62 79 74 65 20 63 6f 6f 72 64 69 6e 61 74 65   byte coordinate
21f0: 73 29 2e 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65  s)..** Therefore
2200: 20 61 6c 6c 20 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f   all non-root no
2210: 64 65 73 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  des must contain
2220: 20 61 74 20 6c 65 61 73 74 20 33 20 65 6e 74 72   at least 3 entr
2230: 69 65 73 2e 20 53 69 6e 63 65 20 0a 2a 2a 20 33  ies. Since .** 3
2240: 5e 34 30 20 69 73 20 67 72 65 61 74 65 72 20 74  ^40 is greater t
2250: 68 61 6e 20 32 5e 36 34 2c 20 61 6e 20 72 2d 74  han 2^64, an r-t
2260: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6c  ree structure al
2270: 77 61 79 73 20 68 61 73 20 61 20 64 65 70 74 68  ways has a depth
2280: 20 6f 66 0a 2a 2a 20 34 30 20 6f 72 20 6c 65 73   of.** 40 or les
2290: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  s..*/.#define RT
22a0: 52 45 45 5f 4d 41 58 5f 44 45 50 54 48 20 34 30  REE_MAX_DEPTH 40
22b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20  .../*.** Number 
22c0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
22d0: 65 20 63 75 72 73 6f 72 20 52 74 72 65 65 4e 6f  e cursor RtreeNo
22e0: 64 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 66  de cache.  The f
22f0: 69 72 73 74 20 65 6e 74 72 79 20 69 73 0a 2a 2a  irst entry is.**
2300: 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 74   used to cache t
2310: 68 65 20 52 74 72 65 65 4e 6f 64 65 20 66 6f 72  he RtreeNode for
2320: 20 52 74 72 65 65 43 75 72 73 6f 72 2e 73 50 6f   RtreeCursor.sPo
2330: 69 6e 74 2e 20 20 54 68 65 20 72 65 6d 61 69 6e  int.  The remain
2340: 69 6e 67 0a 2a 2a 20 65 6e 74 72 69 65 73 20 63  ing.** entries c
2350: 61 63 68 65 20 74 68 65 20 52 74 72 65 65 4e 6f  ache the RtreeNo
2360: 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
2370: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2380: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 2e   priority queue.
2390: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52 45  .*/.#define RTRE
23a0: 45 5f 43 41 43 48 45 5f 53 5a 20 20 35 0a 0a 2f  E_CACHE_SZ  5../
23b0: 2a 20 0a 2a 2a 20 41 6e 20 72 74 72 65 65 20 63  * .** An rtree c
23c0: 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  ursor object..*/
23d0: 0a 73 74 72 75 63 74 20 52 74 72 65 65 43 75 72  .struct RtreeCur
23e0: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
23f0: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
2400: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73  ;         /* Bas
2410: 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
2420: 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 75 38 20  e first */.  u8 
2430: 61 74 45 4f 46 3b 20 20 20 20 20 20 20 20 20 20  atEOF;          
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2450: 2a 20 54 72 75 65 20 69 66 20 61 74 20 65 6e 64  * True if at end
2460: 20 6f 66 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   of search */.  
2470: 75 38 20 62 50 6f 69 6e 74 3b 20 20 20 20 20 20  u8 bPoint;      
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 50 6f    /* True if sPo
24a0: 69 6e 74 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  int is valid */.
24b0: 20 20 75 38 20 62 41 75 78 56 61 6c 69 64 3b 20    u8 bAuxValid; 
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
24e0: 52 65 61 64 41 75 78 20 69 73 20 76 61 6c 69 64  ReadAux is valid
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 72 61 74   */.  int iStrat
2500: 65 67 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  egy;            
2510: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
2520: 6f 66 20 69 64 78 4e 75 6d 20 73 65 61 72 63 68  of idxNum search
2530: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
2540: 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2570: 6e 74 72 69 65 73 20 69 6e 20 61 43 6f 6e 73 74  ntries in aConst
2580: 72 61 69 6e 74 20 2a 2f 0a 20 20 52 74 72 65 65  raint */.  Rtree
2590: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  Constraint *aCon
25a0: 73 74 72 61 69 6e 74 3b 20 20 20 20 20 2f 2a 20  straint;     /* 
25b0: 53 65 61 72 63 68 20 63 6f 6e 73 74 72 61 69 6e  Search constrain
25c0: 74 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f  ts. */.  int nPo
25d0: 69 6e 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  intAlloc;       
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25f0: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c  mber of slots al
2600: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 50 6f 69  located for aPoi
2610: 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  nt[] */.  int nP
2620: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
2630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2640: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 75  umber of slots u
2650: 73 65 64 20 69 6e 20 61 50 6f 69 6e 74 5b 5d 20  sed in aPoint[] 
2660: 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c  */.  int mxLevel
2670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2680: 20 20 20 20 20 20 20 2f 2a 20 69 4c 65 76 65 6c         /* iLevel
2690: 20 76 61 6c 75 65 20 66 6f 72 20 72 6f 6f 74 20   value for root 
26a0: 6f 66 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20  of the tree */. 
26b0: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
26c0: 74 20 2a 61 50 6f 69 6e 74 3b 20 20 20 20 20 20  t *aPoint;      
26d0: 20 20 20 2f 2a 20 50 72 69 6f 72 69 74 79 20 71     /* Priority q
26e0: 75 65 75 65 20 66 6f 72 20 73 65 61 72 63 68 20  ueue for search 
26f0: 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  points */.  sqli
2700: 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 61 64 41  te3_stmt *pReadA
2710: 75 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ux;           /*
2720: 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   Statement to re
2730: 61 64 20 61 75 78 2d 64 61 74 61 20 2a 2f 0a 20  ad aux-data */. 
2740: 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   RtreeSearchPoin
2750: 74 20 73 50 6f 69 6e 74 3b 20 20 20 20 20 20 20  t sPoint;       
2760: 20 20 20 2f 2a 20 43 61 63 68 65 64 20 6e 65 78     /* Cached nex
2770: 74 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20 2a  t search point *
2780: 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 61  /.  RtreeNode *a
2790: 4e 6f 64 65 5b 52 54 52 45 45 5f 43 41 43 48 45  Node[RTREE_CACHE
27a0: 5f 53 5a 5d 3b 20 2f 2a 20 52 74 72 65 65 20 6e  _SZ]; /* Rtree n
27b0: 6f 64 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  ode cache */.  u
27c0: 33 32 20 61 6e 51 75 65 75 65 5b 52 54 52 45 45  32 anQueue[RTREE
27d0: 5f 4d 41 58 5f 44 45 50 54 48 2b 31 5d 3b 20 20  _MAX_DEPTH+1];  
27e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 71 75   /* Number of qu
27f0: 65 75 65 64 20 65 6e 74 72 69 65 73 20 62 79 20  eued entries by 
2800: 69 4c 65 76 65 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  iLevel */.};../*
2810: 20 52 65 74 75 72 6e 20 74 68 65 20 52 74 72 65   Return the Rtre
2820: 65 20 6f 66 20 61 20 52 74 72 65 65 43 75 72 73  e of a RtreeCurs
2830: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  or */.#define RT
2840: 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 58 29  REE_OF_CURSOR(X)
2850: 20 20 20 28 28 52 74 72 65 65 2a 29 28 28 58 29     ((Rtree*)((X)
2860: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 29 0a 0a  ->base.pVtab))..
2870: 2f 2a 0a 2a 2a 20 41 20 63 6f 6f 72 64 69 6e 61  /*.** A coordina
2880: 74 65 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  te can be either
2890: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
28a0: 74 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 69 6e  t number or a in
28b0: 74 65 67 65 72 2e 20 20 41 6c 6c 0a 2a 2a 20 63  teger.  All.** c
28c0: 6f 6f 72 64 69 6e 61 74 65 73 20 77 69 74 68 69  oordinates withi
28d0: 6e 20 61 20 73 69 6e 67 6c 65 20 52 2d 54 72 65  n a single R-Tre
28e0: 65 20 61 72 65 20 61 6c 77 61 79 73 20 6f 66 20  e are always of 
28f0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
2900: 2f 0a 75 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f  /.union RtreeCoo
2910: 72 64 20 7b 0a 20 20 52 74 72 65 65 56 61 6c 75  rd {.  RtreeValu
2920: 65 20 66 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f  e f;      /* Flo
2930: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
2940: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
2950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
2960: 65 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20  eger value */.  
2970: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
2980: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 66     /* Unsigned f
2990: 6f 72 20 62 79 74 65 2d 6f 72 64 65 72 20 63 6f  or byte-order co
29a0: 6e 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a  nversions */.};.
29b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
29c0: 65 6e 74 20 69 73 20 61 6e 20 52 74 72 65 65 43  ent is an RtreeC
29d0: 6f 6f 72 64 2e 20 52 65 74 75 72 6e 20 74 68 65  oord. Return the
29e0: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 77 69   value stored wi
29f0: 74 68 69 6e 20 74 68 65 20 52 74 72 65 65 43 6f  thin the RtreeCo
2a00: 6f 72 64 0a 2a 2a 20 66 6f 72 6d 61 74 74 65 64  ord.** formatted
2a10: 20 61 73 20 61 20 52 74 72 65 65 44 56 61 6c 75   as a RtreeDValu
2a20: 65 20 28 64 6f 75 62 6c 65 20 6f 72 20 69 6e 74  e (double or int
2a30: 36 34 29 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  64). This macro 
2a40: 61 73 73 75 6d 65 73 20 74 68 61 74 20 6c 6f 63  assumes that loc
2a50: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 70  al.** variable p
2a60: 52 74 72 65 65 20 70 6f 69 6e 74 73 20 74 6f 20  Rtree points to 
2a70: 74 68 65 20 52 74 72 65 65 20 73 74 72 75 63 74  the Rtree struct
2a80: 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
2a90: 69 74 68 20 74 68 65 0a 2a 2a 20 52 74 72 65 65  ith the.** Rtree
2aa0: 43 6f 6f 72 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  Coord..*/.#ifdef
2ab0: 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e   SQLITE_RTREE_IN
2ac0: 54 5f 4f 4e 4c 59 0a 23 20 64 65 66 69 6e 65 20  T_ONLY.# define 
2ad0: 44 43 4f 4f 52 44 28 63 6f 6f 72 64 29 20 28 28  DCOORD(coord) ((
2ae0: 52 74 72 65 65 44 56 61 6c 75 65 29 63 6f 6f 72  RtreeDValue)coor
2af0: 64 2e 69 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  d.i).#else.# def
2b00: 69 6e 65 20 44 43 4f 4f 52 44 28 63 6f 6f 72 64  ine DCOORD(coord
2b10: 29 20 28 20 20 20 20 20 20 20 20 20 20 20 20 20  ) (             
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b30: 20 20 20 20 28 70 52 74 72 65 65 2d 3e 65 43 6f      (pRtree->eCo
2b40: 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f 43  ordType==RTREE_C
2b50: 4f 4f 52 44 5f 52 45 41 4c 33 32 29 20 3f 20 20  OORD_REAL32) ?  
2b60: 20 20 20 20 5c 0a 20 20 20 20 20 20 28 28 64 6f      \.      ((do
2b70: 75 62 6c 65 29 63 6f 6f 72 64 2e 66 29 20 3a 20  uble)coord.f) : 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2ba0: 20 20 28 28 64 6f 75 62 6c 65 29 63 6f 6f 72 64    ((double)coord
2bb0: 2e 69 29 20 20 20 20 20 20 20 20 20 20 20 20 20  .i)             
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 5c 0a 20 20 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  \.  ).#endif../*
2be0: 0a 2a 2a 20 41 20 73 65 61 72 63 68 20 63 6f 6e  .** A search con
2bf0: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 72 75  straint..*/.stru
2c00: 63 74 20 52 74 72 65 65 43 6f 6e 73 74 72 61 69  ct RtreeConstrai
2c10: 6e 74 20 7b 0a 20 20 69 6e 74 20 69 43 6f 6f 72  nt {.  int iCoor
2c20: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2c30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2c40: 6f 66 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 63  of constrained c
2c50: 6f 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 20 20 69  oordinate */.  i
2c60: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c80: 2a 20 43 6f 6e 73 74 72 61 69 6e 69 6e 67 20 6f  * Constraining o
2c90: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  peration */.  un
2ca0: 69 6f 6e 20 7b 0a 20 20 20 20 52 74 72 65 65 44  ion {.    RtreeD
2cb0: 56 61 6c 75 65 20 72 56 61 6c 75 65 3b 20 20 20  Value rValue;   
2cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2cd0: 73 74 72 61 69 6e 74 20 76 61 6c 75 65 2e 20 2a  straint value. *
2ce0: 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78 47 65 6f  /.    int (*xGeo
2cf0: 6d 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  m)(sqlite3_rtree
2d00: 5f 67 65 6f 6d 65 74 72 79 2a 2c 69 6e 74 2c 52  _geometry*,int,R
2d10: 74 72 65 65 44 56 61 6c 75 65 2a 2c 69 6e 74 2a  treeDValue*,int*
2d20: 29 3b 0a 20 20 20 20 69 6e 74 20 28 2a 78 51 75  );.    int (*xQu
2d30: 65 72 79 46 75 6e 63 29 28 73 71 6c 69 74 65 33  eryFunc)(sqlite3
2d40: 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66  _rtree_query_inf
2d50: 6f 2a 29 3b 0a 20 20 7d 20 75 3b 0a 20 20 73 71  o*);.  } u;.  sq
2d60: 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72  lite3_rtree_quer
2d70: 79 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 3b 20 20  y_info *pInfo;  
2d80: 2f 2a 20 78 47 65 6f 6d 20 61 6e 64 20 78 51 75  /* xGeom and xQu
2d90: 65 72 79 46 75 6e 63 20 61 72 67 75 6d 65 6e 74  eryFunc argument
2da0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73 69   */.};../* Possi
2db0: 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 52  ble values for R
2dc0: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 2e 6f  treeConstraint.o
2dd0: 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  p */.#define RTR
2de0: 45 45 5f 45 51 20 20 20 20 30 78 34 31 20 20 2f  EE_EQ    0x41  /
2df0: 2a 20 41 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  * A */.#define R
2e00: 54 52 45 45 5f 4c 45 20 20 20 20 30 78 34 32 20  TREE_LE    0x42 
2e10: 20 2f 2a 20 42 20 2a 2f 0a 23 64 65 66 69 6e 65   /* B */.#define
2e20: 20 52 54 52 45 45 5f 4c 54 20 20 20 20 30 78 34   RTREE_LT    0x4
2e30: 33 20 20 2f 2a 20 43 20 2a 2f 0a 23 64 65 66 69  3  /* C */.#defi
2e40: 6e 65 20 52 54 52 45 45 5f 47 45 20 20 20 20 30  ne RTREE_GE    0
2e50: 78 34 34 20 20 2f 2a 20 44 20 2a 2f 0a 23 64 65  x44  /* D */.#de
2e60: 66 69 6e 65 20 52 54 52 45 45 5f 47 54 20 20 20  fine RTREE_GT   
2e70: 20 30 78 34 35 20 20 2f 2a 20 45 20 2a 2f 0a 23   0x45  /* E */.#
2e80: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 54  define RTREE_MAT
2e90: 43 48 20 30 78 34 36 20 20 2f 2a 20 46 3a 20 4f  CH 0x46  /* F: O
2ea0: 6c 64 2d 73 74 79 6c 65 20 73 71 6c 69 74 65 33  ld-style sqlite3
2eb0: 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f  _rtree_geometry_
2ec0: 63 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 23 64  callback() */.#d
2ed0: 65 66 69 6e 65 20 52 54 52 45 45 5f 51 55 45 52  efine RTREE_QUER
2ee0: 59 20 30 78 34 37 20 20 2f 2a 20 47 3a 20 4e 65  Y 0x47  /* G: Ne
2ef0: 77 2d 73 74 79 6c 65 20 73 71 6c 69 74 65 33 5f  w-style sqlite3_
2f00: 72 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c  rtree_query_call
2f10: 62 61 63 6b 28 29 20 2a 2f 0a 0a 0a 2f 2a 20 0a  back() */.../* .
2f20: 2a 2a 20 41 6e 20 72 74 72 65 65 20 73 74 72 75  ** An rtree stru
2f30: 63 74 75 72 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73  cture node..*/.s
2f40: 74 72 75 63 74 20 52 74 72 65 65 4e 6f 64 65 20  truct RtreeNode 
2f50: 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  {.  RtreeNode *p
2f60: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
2f70: 2f 2a 20 50 61 72 65 6e 74 20 6e 6f 64 65 20 2a  /* Parent node *
2f80: 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65 3b 20 20  /.  i64 iNode;  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 2f 2a 20 54 68 65 20 6e 6f 64 65 20 6e 75 6d 62  /* The node numb
2fb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  er */.  int nRef
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fe0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2ff0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  his node */.  in
3000: 74 20 69 73 44 69 72 74 79 3b 20 20 20 20 20 20  t isDirty;      
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3020: 65 20 69 66 20 74 68 65 20 6e 6f 64 65 20 6e 65  e if the node ne
3030: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
3040: 6e 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 75  n to disk */.  u
3050: 38 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20  8 *zData;       
3060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3070: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 6f 64  ntent of the nod
3080: 65 2c 20 61 73 20 73 68 6f 75 6c 64 20 62 65 20  e, as should be 
3090: 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 52 74 72  on disk */.  Rtr
30a0: 65 65 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20  eeNode *pNext;  
30b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
30c0: 20 6e 6f 64 65 20 69 6e 20 74 68 69 73 20 68 61   node in this ha
30d0: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
30e0: 69 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74  in */.};../* Ret
30f0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
3100: 66 20 63 65 6c 6c 73 20 69 6e 20 61 20 6e 6f 64  f cells in a nod
3110: 65 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 43  e  */.#define NC
3120: 45 4c 4c 28 70 4e 6f 64 65 29 20 72 65 61 64 49  ELL(pNode) readI
3130: 6e 74 31 36 28 26 28 70 4e 6f 64 65 29 2d 3e 7a  nt16(&(pNode)->z
3140: 44 61 74 61 5b 32 5d 29 0a 0a 2f 2a 20 0a 2a 2a  Data[2])../* .**
3150: 20 41 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20 66   A single cell f
3160: 72 6f 6d 20 61 20 6e 6f 64 65 2c 20 64 65 73 65  rom a node, dese
3170: 72 69 61 6c 69 7a 65 64 0a 2a 2f 0a 73 74 72 75  rialized.*/.stru
3180: 63 74 20 52 74 72 65 65 43 65 6c 6c 20 7b 0a 20  ct RtreeCell {. 
3190: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 4e 6f 64 65 20 6f 72 20 65 6e 74 72 79 20 49 44  Node or entry ID
31d0: 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72 64   */.  RtreeCoord
31e0: 20 61 43 6f 6f 72 64 5b 52 54 52 45 45 5f 4d 41   aCoord[RTREE_MA
31f0: 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32 5d 3b  X_DIMENSIONS*2];
3200: 20 20 2f 2a 20 42 6f 75 6e 64 69 6e 67 20 62 6f    /* Bounding bo
3210: 78 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f  x coordinates */
3220: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .};.../*.** This
3230: 20 6f 62 6a 65 63 74 20 62 65 63 6f 6d 65 73 20   object becomes 
3240: 74 68 65 20 73 71 6c 69 74 65 33 5f 75 73 65 72  the sqlite3_user
3250: 5f 64 61 74 61 28 29 20 66 6f 72 20 74 68 65 20  _data() for the 
3260: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  SQL functions.**
3270: 20 74 68 61 74 20 61 72 65 20 63 72 65 61 74 65   that are create
3280: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 74 72  d by sqlite3_rtr
3290: 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c  ee_geometry_call
32a0: 62 61 63 6b 28 29 20 61 6e 64 0a 2a 2a 20 73 71  back() and.** sq
32b0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72  lite3_rtree_quer
32c0: 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 6e 64  y_callback() and
32d0: 20 77 68 69 63 68 20 61 70 70 65 61 72 20 6f 6e   which appear on
32e0: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 4d 41   the right of MA
32f0: 54 43 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73  TCH.** operators
3300: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
3310: 73 74 72 61 69 6e 20 61 20 73 65 61 72 63 68 2e  strain a search.
3320: 0a 2a 2a 0a 2a 2a 20 78 47 65 6f 6d 20 61 6e 64  .**.** xGeom and
3330: 20 78 51 75 65 72 79 46 75 6e 63 20 61 72 65 20   xQueryFunc are 
3340: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
3350: 63 74 69 6f 6e 73 2e 20 20 45 78 61 63 74 6c 79  ctions.  Exactly
3360: 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 78 47 65 6f   one of .** xGeo
3370: 6d 20 61 6e 64 20 78 51 75 65 72 79 46 75 6e 63  m and xQueryFunc
3380: 20 66 69 65 6c 64 73 20 69 73 20 6e 6f 6e 2d 4e   fields is non-N
3390: 55 4c 4c 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ULL, depending o
33a0: 6e 20 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a  n whether the.**
33b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 61   SQL function wa
33c0: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
33d0: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
33e0: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
33f0: 29 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ) or.** sqlite3_
3400: 72 74 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c  rtree_query_call
3410: 62 61 63 6b 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 54  back()..** .** T
3420: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 64 65  his object is de
3430: 6c 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  leted automatica
3440: 6c 6c 79 20 62 79 20 74 68 65 20 64 65 73 74 72  lly by the destr
3450: 75 63 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20  uctor mechanism 
3460: 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  in.** sqlite3_cr
3470: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
3480: 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  ()..*/.struct Rt
3490: 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
34a0: 7b 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29  {.  int (*xGeom)
34b0: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67  (sqlite3_rtree_g
34c0: 65 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52  eometry*, int, R
34d0: 74 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74  treeDValue*, int
34e0: 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 51 75 65  *);.  int (*xQue
34f0: 72 79 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  ryFunc)(sqlite3_
3500: 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66 6f  rtree_query_info
3510: 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *);.  void (*xDe
3520: 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29  structor)(void*)
3530: 3b 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  ;.  void *pConte
3540: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  xt;.};../*.** An
3550: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
3560: 73 20 73 74 72 75 63 74 75 72 65 20 28 69 6e 20  s structure (in 
3570: 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 20 42 4c  the form of a BL
3580: 4f 42 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  OB) is returned 
3590: 62 79 0a 2a 2a 20 74 68 65 20 53 51 4c 20 66 75  by.** the SQL fu
35a0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 73 71 6c  nctions that sql
35b0: 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
35c0: 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61  try_callback() a
35d0: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 74  nd.** sqlite3_rt
35e0: 72 65 65 5f 71 75 65 72 79 5f 63 61 6c 6c 62 61  ree_query_callba
35f0: 63 6b 28 29 20 63 72 65 61 74 65 2c 20 61 6e 64  ck() create, and
3600: 20 69 73 20 72 65 61 64 20 61 73 20 74 68 65 20   is read as the 
3610: 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 6f 70  right-hand.** op
3620: 65 72 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54  erand to the MAT
3630: 43 48 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 61  CH operator of a
3640: 6e 20 52 2d 54 72 65 65 2e 0a 2a 2f 0a 73 74 72  n R-Tree..*/.str
3650: 75 63 74 20 52 74 72 65 65 4d 61 74 63 68 41 72  uct RtreeMatchAr
3660: 67 20 7b 0a 20 20 75 33 32 20 69 53 69 7a 65 3b  g {.  u32 iSize;
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69    /* Size of thi
3690: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 74  s object */.  Rt
36a0: 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
36b0: 63 62 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  cb;       /* Inf
36c0: 6f 20 61 62 6f 75 74 20 74 68 65 20 63 61 6c 6c  o about the call
36d0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 20 2a  back functions *
36e0: 2f 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d 3b 20  /.  int nParam; 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
3710: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 53  ameters to the S
3720: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
3730: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3740: 2a 61 70 53 71 6c 50 61 72 61 6d 3b 20 2f 2a 20  *apSqlParam; /* 
3750: 4f 72 69 67 69 6e 61 6c 20 53 51 4c 20 70 61 72  Original SQL par
3760: 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20 2a 2f  ameter values */
3770: 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 61  .  RtreeDValue a
3780: 50 61 72 61 6d 5b 31 5d 3b 20 20 20 20 20 20 2f  Param[1];      /
3790: 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 70 61 72  * Values for par
37a0: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 53  ameters to the S
37b0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7d  QL function */.}
37c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4d 41 58 0a 23  ;..#ifndef MAX.#
37d0: 20 64 65 66 69 6e 65 20 4d 41 58 28 78 2c 79 29   define MAX(x,y)
37e0: 20 28 28 78 29 20 3c 20 28 79 29 20 3f 20 28 79   ((x) < (y) ? (y
37f0: 29 20 3a 20 28 78 29 29 0a 23 65 6e 64 69 66 0a  ) : (x)).#endif.
3800: 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23 20 64 65  #ifndef MIN.# de
3810: 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29 20 28 28  fine MIN(x,y) ((
3820: 78 29 20 3e 20 28 79 29 20 3f 20 28 79 29 20 3a  x) > (y) ? (y) :
3830: 20 28 78 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   (x)).#endif../*
3840: 20 57 68 61 74 20 76 65 72 73 69 6f 6e 20 6f 66   What version of
3850: 20 47 43 43 20 69 73 20 62 65 69 6e 67 20 75 73   GCC is being us
3860: 65 64 2e 20 20 30 20 6d 65 61 6e 73 20 47 43 43  ed.  0 means GCC
3870: 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 75 73   is not being us
3880: 65 64 20 2e 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ed ..** Note tha
3890: 74 20 74 68 65 20 47 43 43 5f 56 45 52 53 49 4f  t the GCC_VERSIO
38a0: 4e 20 6d 61 63 72 6f 20 77 69 6c 6c 20 61 6c 73  N macro will als
38b0: 6f 20 62 65 20 73 65 74 20 63 6f 72 72 65 63 74  o be set correct
38c0: 6c 79 20 77 68 65 6e 20 75 73 69 6e 67 0a 2a 2a  ly when using.**
38d0: 20 63 6c 61 6e 67 2c 20 73 69 6e 63 65 20 63 6c   clang, since cl
38e0: 61 6e 67 20 77 6f 72 6b 73 20 68 61 72 64 20 74  ang works hard t
38f0: 6f 20 62 65 20 67 63 63 20 63 6f 6d 70 61 74 69  o be gcc compati
3900: 62 6c 65 2e 20 20 53 6f 20 74 68 65 20 67 63 63  ble.  So the gcc
3910: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
3920: 73 20 77 69 6c 6c 20 61 6c 73 6f 20 77 6f 72 6b  s will also work
3930: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
3940: 77 69 74 68 20 63 6c 61 6e 67 2e 0a 2a 2f 0a 23  with clang..*/.#
3950: 69 66 6e 64 65 66 20 47 43 43 5f 56 45 52 53 49  ifndef GCC_VERSI
3960: 4f 4e 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ON.#if defined(_
3970: 5f 47 4e 55 43 5f 5f 29 20 26 26 20 21 64 65 66  _GNUC__) && !def
3980: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41  ined(SQLITE_DISA
3990: 42 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29 0a 23  BLE_INTRINSIC).#
39a0: 20 64 65 66 69 6e 65 20 47 43 43 5f 56 45 52 53   define GCC_VERS
39b0: 49 4f 4e 20 28 5f 5f 47 4e 55 43 5f 5f 2a 31 30  ION (__GNUC__*10
39c0: 30 30 30 30 30 2b 5f 5f 47 4e 55 43 5f 4d 49 4e  00000+__GNUC_MIN
39d0: 4f 52 5f 5f 2a 31 30 30 30 2b 5f 5f 47 4e 55 43  OR__*1000+__GNUC
39e0: 5f 50 41 54 43 48 4c 45 56 45 4c 5f 5f 29 0a 23  _PATCHLEVEL__).#
39f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 47 43  else.# define GC
3a00: 43 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65 6e 64  C_VERSION 0.#end
3a10: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 54 68  if.#endif../* Th
3a20: 65 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  e testcase() mac
3a30: 72 6f 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ro should alread
3a40: 79 20 62 65 20 64 65 66 69 6e 65 64 20 69 6e 20  y be defined in 
3a50: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
3a60: 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 6e  .  If.** it is n
3a70: 6f 74 2c 20 6d 61 6b 65 20 69 74 20 61 20 6e 6f  ot, make it a no
3a80: 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  -op..*/.#ifndef 
3a90: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
3aa0: 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 74 65 73  ION.# define tes
3ab0: 74 63 61 73 65 28 58 29 0a 23 65 6e 64 69 66 0a  tcase(X).#endif.
3ac0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f  ./*.** Macros to
3ad0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
3ae0: 65 72 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69  er the machine i
3af0: 73 20 62 69 67 20 6f 72 20 6c 69 74 74 6c 65 20  s big or little 
3b00: 65 6e 64 69 61 6e 2c 0a 2a 2a 20 61 6e 64 20 77  endian,.** and w
3b10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
3b20: 61 74 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e  at determination
3b30: 20 69 73 20 72 75 6e 2d 74 69 6d 65 20 6f 72 20   is run-time or 
3b40: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 2a 2a  compile-time..**
3b50: 0a 2a 2a 20 46 6f 72 20 62 65 73 74 20 70 65 72  .** For best per
3b60: 66 6f 72 6d 61 6e 63 65 2c 20 61 6e 20 61 74 74  formance, an att
3b70: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
3b80: 67 75 65 73 73 20 61 74 20 74 68 65 20 62 79 74  guess at the byt
3b90: 65 2d 6f 72 64 65 72 0a 2a 2a 20 75 73 69 6e 67  e-order.** using
3ba0: 20 43 2d 70 72 65 70 72 6f 63 65 73 73 6f 72 20   C-preprocessor 
3bb0: 6d 61 63 72 6f 73 2e 20 20 49 66 20 74 68 61 74  macros.  If that
3bc0: 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
3bd0: 2c 20 6f 72 20 69 66 0a 2a 2a 20 2d 44 53 51 4c  , or if.** -DSQL
3be0: 49 54 45 5f 52 55 4e 54 49 4d 45 5f 42 59 54 45  ITE_RUNTIME_BYTE
3bf0: 4f 52 44 45 52 3d 31 20 69 73 20 73 65 74 2c 20  ORDER=1 is set, 
3c00: 74 68 65 6e 20 62 79 74 65 2d 6f 72 64 65 72 20  then byte-order 
3c10: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
3c20: 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2f   at run-time..*/
3c30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3c40: 42 59 54 45 4f 52 44 45 52 0a 23 69 66 20 64 65  BYTEORDER.#if de
3c50: 66 69 6e 65 64 28 69 33 38 36 29 20 20 20 20 20  fined(i386)     
3c60: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 33 38  || defined(__i38
3c70: 36 5f 5f 29 20 20 20 7c 7c 20 64 65 66 69 6e 65  6__)   || define
3c80: 64 28 5f 4d 5f 49 58 38 36 29 20 7c 7c 20 20 20  d(_M_IX86) ||   
3c90: 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 5f   \.    defined(_
3ca0: 5f 78 38 36 5f 36 34 29 20 7c 7c 20 64 65 66 69  _x86_64) || defi
3cb0: 6e 65 64 28 5f 5f 78 38 36 5f 36 34 5f 5f 29 20  ned(__x86_64__) 
3cc0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 58 36  || defined(_M_X6
3cd0: 34 29 20 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20  4)  ||    \.    
3ce0: 64 65 66 69 6e 65 64 28 5f 4d 5f 41 4d 44 36 34  defined(_M_AMD64
3cf0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f  ) || defined(_M_
3d00: 41 52 4d 29 20 20 20 20 20 7c 7c 20 64 65 66 69  ARM)     || defi
3d10: 6e 65 64 28 5f 5f 78 38 36 29 20 20 20 7c 7c 20  ned(__x86)   || 
3d20: 20 20 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64     \.    defined
3d30: 28 5f 5f 61 72 6d 5f 5f 29 0a 23 20 64 65 66 69  (__arm__).# defi
3d40: 6e 65 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52  ne SQLITE_BYTEOR
3d50: 44 45 52 20 20 20 20 31 32 33 34 0a 23 65 6c 69  DER    1234.#eli
3d60: 66 20 64 65 66 69 6e 65 64 28 73 70 61 72 63 29  f defined(sparc)
3d70: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f      || defined(_
3d80: 5f 70 70 63 5f 5f 29 0a 23 20 64 65 66 69 6e 65  _ppc__).# define
3d90: 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
3da0: 52 20 20 20 20 34 33 32 31 0a 23 65 6c 73 65 0a  R    4321.#else.
3db0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
3dc0: 42 59 54 45 4f 52 44 45 52 20 20 20 20 30 20 20  BYTEORDER    0  
3dd0: 20 20 20 2f 2a 20 30 20 6d 65 61 6e 73 20 22 75     /* 0 means "u
3de0: 6e 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c  nknown at compil
3df0: 65 2d 74 69 6d 65 22 20 2a 2f 0a 23 65 6e 64 69  e-time" */.#endi
3e00: 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 57 68  f.#endif.../* Wh
3e10: 61 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  at version of MS
3e20: 56 43 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  VC is being used
3e30: 2e 20 20 30 20 6d 65 61 6e 73 20 4d 53 56 43 20  .  0 means MSVC 
3e40: 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 75 73 65  is not being use
3e50: 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 53 56  d */.#ifndef MSV
3e60: 43 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65  C_VERSION.#if de
3e70: 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20  fined(_MSC_VER) 
3e80: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
3e90: 54 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49  TE_DISABLE_INTRI
3ea0: 4e 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 4d  NSIC).# define M
3eb0: 53 56 43 5f 56 45 52 53 49 4f 4e 20 5f 4d 53 43  SVC_VERSION _MSC
3ec0: 5f 56 45 52 0a 23 65 6c 73 65 0a 23 20 64 65 66  _VER.#else.# def
3ed0: 69 6e 65 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e  ine MSVC_VERSION
3ee0: 20 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   0.#endif.#endif
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
3f00: 73 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  s to deserialize
3f10: 20 61 20 31 36 20 62 69 74 20 69 6e 74 65 67 65   a 16 bit intege
3f20: 72 2c 20 33 32 20 62 69 74 20 72 65 61 6c 20 6e  r, 32 bit real n
3f30: 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20 36 34 20  umber and.** 64 
3f40: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 54 68 65  bit integer. The
3f50: 20 64 65 73 65 72 69 61 6c 69 7a 65 64 20 76 61   deserialized va
3f60: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
3f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
3f80: 65 61 64 49 6e 74 31 36 28 75 38 20 2a 70 29 7b  eadInt16(u8 *p){
3f90: 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c  .  return (p[0]<
3fa0: 3c 38 29 20 2b 20 70 5b 31 5d 3b 0a 7d 0a 73 74  <8) + p[1];.}.st
3fb0: 61 74 69 63 20 76 6f 69 64 20 72 65 61 64 43 6f  atic void readCo
3fc0: 6f 72 64 28 75 38 20 2a 70 2c 20 52 74 72 65 65  ord(u8 *p, Rtree
3fd0: 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 29 7b 0a  Coord *pCoord){.
3fe0: 20 20 61 73 73 65 72 74 28 20 28 28 28 28 63 68    assert( ((((ch
3ff0: 61 72 2a 29 70 29 20 2d 20 28 63 68 61 72 2a 29  ar*)p) - (char*)
4000: 30 29 26 33 29 3d 3d 30 20 29 3b 20 20 2f 2a 20  0)&3)==0 );  /* 
4010: 70 20 69 73 20 61 6c 77 61 79 73 20 34 2d 62 79  p is always 4-by
4020: 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 23 69  te aligned */.#i
4030: 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  f SQLITE_BYTEORD
4040: 45 52 3d 3d 31 32 33 34 20 26 26 20 4d 53 56 43  ER==1234 && MSVC
4050: 5f 56 45 52 53 49 4f 4e 3e 3d 31 33 30 30 0a 20  _VERSION>=1300. 
4060: 20 70 43 6f 6f 72 64 2d 3e 75 20 3d 20 5f 62 79   pCoord->u = _by
4070: 74 65 73 77 61 70 5f 75 6c 6f 6e 67 28 2a 28 75  teswap_ulong(*(u
4080: 33 32 2a 29 70 29 3b 0a 23 65 6c 69 66 20 53 51  32*)p);.#elif SQ
4090: 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d  LITE_BYTEORDER==
40a0: 31 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53  1234 && GCC_VERS
40b0: 49 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 70  ION>=4003000.  p
40c0: 43 6f 6f 72 64 2d 3e 75 20 3d 20 5f 5f 62 75 69  Coord->u = __bui
40d0: 6c 74 69 6e 5f 62 73 77 61 70 33 32 28 2a 28 75  ltin_bswap32(*(u
40e0: 33 32 2a 29 70 29 3b 0a 23 65 6c 69 66 20 53 51  32*)p);.#elif SQ
40f0: 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d  LITE_BYTEORDER==
4100: 34 33 32 31 0a 20 20 70 43 6f 6f 72 64 2d 3e 75  4321.  pCoord->u
4110: 20 3d 20 2a 28 75 33 32 2a 29 70 3b 0a 23 65 6c   = *(u32*)p;.#el
4120: 73 65 0a 20 20 70 43 6f 6f 72 64 2d 3e 75 20 3d  se.  pCoord->u =
4130: 20 28 0a 20 20 20 20 28 28 28 75 33 32 29 70 5b   (.    (((u32)p[
4140: 30 5d 29 20 3c 3c 20 32 34 29 20 2b 20 0a 20 20  0]) << 24) + .  
4150: 20 20 28 28 28 75 33 32 29 70 5b 31 5d 29 20 3c    (((u32)p[1]) <
4160: 3c 20 31 36 29 20 2b 20 0a 20 20 20 20 28 28 28  < 16) + .    (((
4170: 75 33 32 29 70 5b 32 5d 29 20 3c 3c 20 20 38 29  u32)p[2]) <<  8)
4180: 20 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29 70   + .    (((u32)p
4190: 5b 33 5d 29 20 3c 3c 20 20 30 29 0a 20 20 29 3b  [3]) <<  0).  );
41a0: 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
41b0: 20 69 36 34 20 72 65 61 64 49 6e 74 36 34 28 75   i64 readInt64(u
41c0: 38 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  8 *p){.#if SQLIT
41d0: 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33  E_BYTEORDER==123
41e0: 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53 49 4f  4 && MSVC_VERSIO
41f0: 4e 3e 3d 31 33 30 30 0a 20 20 75 36 34 20 78 3b  N>=1300.  u64 x;
4200: 0a 20 20 6d 65 6d 63 70 79 28 26 78 2c 20 70 2c  .  memcpy(&x, p,
4210: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69   8);.  return (i
4220: 36 34 29 5f 62 79 74 65 73 77 61 70 5f 75 69 6e  64)_byteswap_uin
4230: 74 36 34 28 78 29 3b 0a 23 65 6c 69 66 20 53 51  t64(x);.#elif SQ
4240: 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d  LITE_BYTEORDER==
4250: 31 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53  1234 && GCC_VERS
4260: 49 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 75  ION>=4003000.  u
4270: 36 34 20 78 3b 0a 20 20 6d 65 6d 63 70 79 28 26  64 x;.  memcpy(&
4280: 78 2c 20 70 2c 20 38 29 3b 0a 20 20 72 65 74 75  x, p, 8);.  retu
4290: 72 6e 20 28 69 36 34 29 5f 5f 62 75 69 6c 74 69  rn (i64)__builti
42a0: 6e 5f 62 73 77 61 70 36 34 28 78 29 3b 0a 23 65  n_bswap64(x);.#e
42b0: 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  lif SQLITE_BYTEO
42c0: 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 69 36 34  RDER==4321.  i64
42d0: 20 78 3b 0a 20 20 6d 65 6d 63 70 79 28 26 78 2c   x;.  memcpy(&x,
42e0: 20 70 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e   p, 8);.  return
42f0: 20 78 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   x;.#else.  retu
4300: 72 6e 20 28 69 36 34 29 28 0a 20 20 20 20 28 28  rn (i64)(.    ((
4310: 28 75 36 34 29 70 5b 30 5d 29 20 3c 3c 20 35 36  (u64)p[0]) << 56
4320: 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34 29  ) + .    (((u64)
4330: 70 5b 31 5d 29 20 3c 3c 20 34 38 29 20 2b 20 0a  p[1]) << 48) + .
4340: 20 20 20 20 28 28 28 75 36 34 29 70 5b 32 5d 29      (((u64)p[2])
4350: 20 3c 3c 20 34 30 29 20 2b 20 0a 20 20 20 20 28   << 40) + .    (
4360: 28 28 75 36 34 29 70 5b 33 5d 29 20 3c 3c 20 33  ((u64)p[3]) << 3
4370: 32 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36 34  2) + .    (((u64
4380: 29 70 5b 34 5d 29 20 3c 3c 20 32 34 29 20 2b 20  )p[4]) << 24) + 
4390: 0a 20 20 20 20 28 28 28 75 36 34 29 70 5b 35 5d  .    (((u64)p[5]
43a0: 29 20 3c 3c 20 31 36 29 20 2b 20 0a 20 20 20 20  ) << 16) + .    
43b0: 28 28 28 75 36 34 29 70 5b 36 5d 29 20 3c 3c 20  (((u64)p[6]) << 
43c0: 20 38 29 20 2b 20 0a 20 20 20 20 28 28 28 75 36   8) + .    (((u6
43d0: 34 29 70 5b 37 5d 29 20 3c 3c 20 20 30 29 0a 20  4)p[7]) <<  0). 
43e0: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   );.#endif.}../*
43f0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f  .** Functions to
4400: 20 73 65 72 69 61 6c 69 7a 65 20 61 20 31 36 20   serialize a 16 
4410: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 33 32 20  bit integer, 32 
4420: 62 69 74 20 72 65 61 6c 20 6e 75 6d 62 65 72 20  bit real number 
4430: 61 6e 64 0a 2a 2a 20 36 34 20 62 69 74 20 69 6e  and.** 64 bit in
4440: 74 65 67 65 72 2e 20 54 68 65 20 76 61 6c 75 65  teger. The value
4450: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
4460: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4470: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
4480: 68 65 20 61 72 67 75 6d 65 6e 74 20 62 75 66 66  he argument buff
4490: 65 72 20 28 61 6c 77 61 79 73 20 32 2c 20 34 20  er (always 2, 4 
44a0: 61 6e 64 20 38 20 72 65 73 70 65 63 74 69 76 65  and 8 respective
44b0: 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ly)..*/.static v
44c0: 6f 69 64 20 77 72 69 74 65 49 6e 74 31 36 28 75  oid writeInt16(u
44d0: 38 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  8 *p, int i){.  
44e0: 70 5b 30 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30  p[0] = (i>> 8)&0
44f0: 78 46 46 3b 0a 20 20 70 5b 31 5d 20 3d 20 28 69  xFF;.  p[1] = (i
4500: 3e 3e 20 30 29 26 30 78 46 46 3b 0a 7d 0a 73 74  >> 0)&0xFF;.}.st
4510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 43 6f  atic int writeCo
4520: 6f 72 64 28 75 38 20 2a 70 2c 20 52 74 72 65 65  ord(u8 *p, Rtree
4530: 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 29 7b 0a  Coord *pCoord){.
4540: 20 20 75 33 32 20 69 3b 0a 20 20 61 73 73 65 72    u32 i;.  asser
4550: 74 28 20 28 28 28 28 63 68 61 72 2a 29 70 29 20  t( ((((char*)p) 
4560: 2d 20 28 63 68 61 72 2a 29 30 29 26 33 29 3d 3d  - (char*)0)&3)==
4570: 30 20 29 3b 20 20 2f 2a 20 70 20 69 73 20 61 6c  0 );  /* p is al
4580: 77 61 79 73 20 34 2d 62 79 74 65 20 61 6c 69 67  ways 4-byte alig
4590: 6e 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ned */.  assert(
45a0: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6f   sizeof(RtreeCoo
45b0: 72 64 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  rd)==4 );.  asse
45c0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
45d0: 3d 34 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  =4 );.#if SQLITE
45e0: 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34  _BYTEORDER==1234
45f0: 20 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e   && GCC_VERSION>
4600: 3d 34 30 30 33 30 30 30 0a 20 20 69 20 3d 20 5f  =4003000.  i = _
4610: 5f 62 75 69 6c 74 69 6e 5f 62 73 77 61 70 33 32  _builtin_bswap32
4620: 28 70 43 6f 6f 72 64 2d 3e 75 29 3b 0a 20 20 6d  (pCoord->u);.  m
4630: 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 34 29 3b  emcpy(p, &i, 4);
4640: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42 59  .#elif SQLITE_BY
4650: 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 20 26 26  TEORDER==1234 &&
4660: 20 4d 53 56 43 5f 56 45 52 53 49 4f 4e 3e 3d 31   MSVC_VERSION>=1
4670: 33 30 30 0a 20 20 69 20 3d 20 5f 62 79 74 65 73  300.  i = _bytes
4680: 77 61 70 5f 75 6c 6f 6e 67 28 70 43 6f 6f 72 64  wap_ulong(pCoord
4690: 2d 3e 75 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  ->u);.  memcpy(p
46a0: 2c 20 26 69 2c 20 34 29 3b 0a 23 65 6c 69 66 20  , &i, 4);.#elif 
46b0: 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
46c0: 3d 3d 34 33 32 31 0a 20 20 69 20 3d 20 70 43 6f  ==4321.  i = pCo
46d0: 6f 72 64 2d 3e 75 3b 0a 20 20 6d 65 6d 63 70 79  ord->u;.  memcpy
46e0: 28 70 2c 20 26 69 2c 20 34 29 3b 0a 23 65 6c 73  (p, &i, 4);.#els
46f0: 65 0a 20 20 69 20 3d 20 70 43 6f 6f 72 64 2d 3e  e.  i = pCoord->
4700: 75 3b 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e 3e  u;.  p[0] = (i>>
4710: 32 34 29 26 30 78 46 46 3b 0a 20 20 70 5b 31 5d  24)&0xFF;.  p[1]
4720: 20 3d 20 28 69 3e 3e 31 36 29 26 30 78 46 46 3b   = (i>>16)&0xFF;
4730: 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 20 38  .  p[2] = (i>> 8
4740: 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20 3d  )&0xFF;.  p[3] =
4750: 20 28 69 3e 3e 20 30 29 26 30 78 46 46 3b 0a 23   (i>> 0)&0xFF;.#
4760: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 34  endif.  return 4
4770: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 77  ;.}.static int w
4780: 72 69 74 65 49 6e 74 36 34 28 75 38 20 2a 70 2c  riteInt64(u8 *p,
4790: 20 69 36 34 20 69 29 7b 0a 23 69 66 20 53 51 4c   i64 i){.#if SQL
47a0: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
47b0: 32 33 34 20 26 26 20 47 43 43 5f 56 45 52 53 49  234 && GCC_VERSI
47c0: 4f 4e 3e 3d 34 30 30 33 30 30 30 0a 20 20 69 20  ON>=4003000.  i 
47d0: 3d 20 28 69 36 34 29 5f 5f 62 75 69 6c 74 69 6e  = (i64)__builtin
47e0: 5f 62 73 77 61 70 36 34 28 28 75 36 34 29 69 29  _bswap64((u64)i)
47f0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 26 69  ;.  memcpy(p, &i
4800: 2c 20 38 29 3b 0a 23 65 6c 69 66 20 53 51 4c 49  , 8);.#elif SQLI
4810: 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32  TE_BYTEORDER==12
4820: 33 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53 49  34 && MSVC_VERSI
4830: 4f 4e 3e 3d 31 33 30 30 0a 20 20 69 20 3d 20 28  ON>=1300.  i = (
4840: 69 36 34 29 5f 62 79 74 65 73 77 61 70 5f 75 69  i64)_byteswap_ui
4850: 6e 74 36 34 28 28 75 36 34 29 69 29 3b 0a 20 20  nt64((u64)i);.  
4860: 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 38 29  memcpy(p, &i, 8)
4870: 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 42  ;.#elif SQLITE_B
4880: 59 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20  YTEORDER==4321. 
4890: 20 6d 65 6d 63 70 79 28 70 2c 20 26 69 2c 20 38   memcpy(p, &i, 8
48a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 5b 30 5d 20  );.#else.  p[0] 
48b0: 3d 20 28 69 3e 3e 35 36 29 26 30 78 46 46 3b 0a  = (i>>56)&0xFF;.
48c0: 20 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 34 38 29    p[1] = (i>>48)
48d0: 26 30 78 46 46 3b 0a 20 20 70 5b 32 5d 20 3d 20  &0xFF;.  p[2] = 
48e0: 28 69 3e 3e 34 30 29 26 30 78 46 46 3b 0a 20 20  (i>>40)&0xFF;.  
48f0: 70 5b 33 5d 20 3d 20 28 69 3e 3e 33 32 29 26 30  p[3] = (i>>32)&0
4900: 78 46 46 3b 0a 20 20 70 5b 34 5d 20 3d 20 28 69  xFF;.  p[4] = (i
4910: 3e 3e 32 34 29 26 30 78 46 46 3b 0a 20 20 70 5b  >>24)&0xFF;.  p[
4920: 35 5d 20 3d 20 28 69 3e 3e 31 36 29 26 30 78 46  5] = (i>>16)&0xF
4930: 46 3b 0a 20 20 70 5b 36 5d 20 3d 20 28 69 3e 3e  F;.  p[6] = (i>>
4940: 20 38 29 26 30 78 46 46 3b 0a 20 20 70 5b 37 5d   8)&0xFF;.  p[7]
4950: 20 3d 20 28 69 3e 3e 20 30 29 26 30 78 46 46 3b   = (i>> 0)&0xFF;
4960: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4970: 20 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63   8;.}../*.** Inc
4980: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
4990: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 6e 6f  ence count of no
49a0: 64 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de p..*/.static 
49b0: 76 6f 69 64 20 6e 6f 64 65 52 65 66 65 72 65 6e  void nodeReferen
49c0: 63 65 28 52 74 72 65 65 4e 6f 64 65 20 2a 70 29  ce(RtreeNode *p)
49d0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
49e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
49f0: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
4a00: 66 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f++;.  }.}../*.*
4a10: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6e 74  * Clear the cont
4a20: 65 6e 74 20 6f 66 20 6e 6f 64 65 20 70 20 28 73  ent of node p (s
4a30: 65 74 20 61 6c 6c 20 62 79 74 65 73 20 74 6f 20  et all bytes to 
4a40: 30 78 30 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  0x00)..*/.static
4a50: 20 76 6f 69 64 20 6e 6f 64 65 5a 65 72 6f 28 52   void nodeZero(R
4a60: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
4a70: 72 65 65 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 6d  reeNode *p){.  m
4a80: 65 6d 73 65 74 28 26 70 2d 3e 7a 44 61 74 61 5b  emset(&p->zData[
4a90: 32 5d 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69  2], 0, pRtree->i
4aa0: 4e 6f 64 65 53 69 7a 65 2d 32 29 3b 0a 20 20 70  NodeSize-2);.  p
4ab0: 2d 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 7d  ->isDirty = 1;.}
4ac0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4ad0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 4e 6f 64  node number iNod
4ae0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  e, return the co
4af0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6b 65 79 20  rresponding key 
4b00: 74 6f 20 75 73 65 0a 2a 2a 20 69 6e 20 74 68 65  to use.** in the
4b10: 20 52 74 72 65 65 2e 61 48 61 73 68 20 74 61 62   Rtree.aHash tab
4b20: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  le..*/.static un
4b30: 73 69 67 6e 65 64 20 69 6e 74 20 6e 6f 64 65 48  signed int nodeH
4b40: 61 73 68 28 69 36 34 20 69 4e 6f 64 65 29 7b 0a  ash(i64 iNode){.
4b50: 20 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67    return ((unsig
4b60: 6e 65 64 29 69 4e 6f 64 65 29 20 25 20 48 41 53  ned)iNode) % HAS
4b70: 48 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  HSIZE;.}../*.** 
4b80: 53 65 61 72 63 68 20 74 68 65 20 6e 6f 64 65 20  Search the node 
4b90: 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6e  hash table for n
4ba0: 6f 64 65 20 69 4e 6f 64 65 2e 20 49 66 20 66 6f  ode iNode. If fo
4bb0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  und, return a po
4bc0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 69 74 2e 20  inter.** to it. 
4bd0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
4be0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  n 0..*/.static R
4bf0: 74 72 65 65 4e 6f 64 65 20 2a 6e 6f 64 65 48 61  treeNode *nodeHa
4c00: 73 68 4c 6f 6f 6b 75 70 28 52 74 72 65 65 20 2a  shLookup(Rtree *
4c10: 70 52 74 72 65 65 2c 20 69 36 34 20 69 4e 6f 64  pRtree, i64 iNod
4c20: 65 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  e){.  RtreeNode 
4c30: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 52 74 72  *p;.  for(p=pRtr
4c40: 65 65 2d 3e 61 48 61 73 68 5b 6e 6f 64 65 48 61  ee->aHash[nodeHa
4c50: 73 68 28 69 4e 6f 64 65 29 5d 3b 20 70 20 26 26  sh(iNode)]; p &&
4c60: 20 70 2d 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64 65   p->iNode!=iNode
4c70: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 3b 0a 20  ; p=p->pNext);. 
4c80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4c90: 0a 2a 2a 20 41 64 64 20 6e 6f 64 65 20 70 4e 6f  .** Add node pNo
4ca0: 64 65 20 74 6f 20 74 68 65 20 6e 6f 64 65 20 68  de to the node h
4cb0: 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ash table..*/.st
4cc0: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 48 61  atic void nodeHa
4cd0: 73 68 49 6e 73 65 72 74 28 52 74 72 65 65 20 2a  shInsert(Rtree *
4ce0: 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64  pRtree, RtreeNod
4cf0: 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74  e *pNode){.  int
4d00: 20 69 48 61 73 68 3b 0a 20 20 61 73 73 65 72 74   iHash;.  assert
4d10: 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3d 3d  ( pNode->pNext==
4d20: 30 20 29 3b 0a 20 20 69 48 61 73 68 20 3d 20 6e  0 );.  iHash = n
4d30: 6f 64 65 48 61 73 68 28 70 4e 6f 64 65 2d 3e 69  odeHash(pNode->i
4d40: 4e 6f 64 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e  Node);.  pNode->
4d50: 70 4e 65 78 74 20 3d 20 70 52 74 72 65 65 2d 3e  pNext = pRtree->
4d60: 61 48 61 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20  aHash[iHash];.  
4d70: 70 52 74 72 65 65 2d 3e 61 48 61 73 68 5b 69 48  pRtree->aHash[iH
4d80: 61 73 68 5d 20 3d 20 70 4e 6f 64 65 3b 0a 7d 0a  ash] = pNode;.}.
4d90: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e 6f  ./*.** Remove no
4da0: 64 65 20 70 4e 6f 64 65 20 66 72 6f 6d 20 74 68  de pNode from th
4db0: 65 20 6e 6f 64 65 20 68 61 73 68 20 74 61 62 6c  e node hash tabl
4dc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
4dd0: 64 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74 65  d nodeHashDelete
4de0: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
4df0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
4e00: 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  ){.  RtreeNode *
4e10: 2a 70 70 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65  *pp;.  if( pNode
4e20: 2d 3e 69 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20  ->iNode!=0 ){.  
4e30: 20 20 70 70 20 3d 20 26 70 52 74 72 65 65 2d 3e    pp = &pRtree->
4e40: 61 48 61 73 68 5b 6e 6f 64 65 48 61 73 68 28 70  aHash[nodeHash(p
4e50: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 5d 3b 0a 20  Node->iNode)];. 
4e60: 20 20 20 66 6f 72 28 20 3b 20 28 2a 70 70 29 21     for( ; (*pp)!
4e70: 3d 70 4e 6f 64 65 3b 20 70 70 20 3d 20 26 28 2a  =pNode; pp = &(*
4e80: 70 70 29 2d 3e 70 4e 65 78 74 29 7b 20 61 73 73  pp)->pNext){ ass
4e90: 65 72 74 28 2a 70 70 29 3b 20 7d 0a 20 20 20 20  ert(*pp); }.    
4ea0: 2a 70 70 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  *pp = pNode->pNe
4eb0: 78 74 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70  xt;.    pNode->p
4ec0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Next = 0;.  }.}.
4ed0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
4ee0: 61 6e 64 20 72 65 74 75 72 6e 20 6e 65 77 20 72  and return new r
4ef0: 2d 74 72 65 65 20 6e 6f 64 65 2e 20 49 6e 69 74  -tree node. Init
4f00: 69 61 6c 6c 79 2c 20 28 52 74 72 65 65 4e 6f 64  ially, (RtreeNod
4f10: 65 2e 69 4e 6f 64 65 3d 3d 30 29 2c 0a 2a 2a 20  e.iNode==0),.** 
4f20: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
4f30: 6e 6f 64 65 20 68 61 73 20 6e 6f 74 20 79 65 74  node has not yet
4f40: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 61   been assigned a
4f50: 20 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 49 74   node number. It
4f60: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20   is.** assigned 
4f70: 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20 77 68  a node number wh
4f80: 65 6e 20 6e 6f 64 65 57 72 69 74 65 28 29 20 69  en nodeWrite() i
4f90: 73 20 63 61 6c 6c 65 64 20 74 6f 20 77 72 69 74  s called to writ
4fa0: 65 20 74 68 65 0a 2a 2a 20 6e 6f 64 65 20 63 6f  e the.** node co
4fb0: 6e 74 65 6e 74 73 20 6f 75 74 20 74 6f 20 74 68  ntents out to th
4fc0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
4fd0: 74 61 74 69 63 20 52 74 72 65 65 4e 6f 64 65 20  tatic RtreeNode 
4fe0: 2a 6e 6f 64 65 4e 65 77 28 52 74 72 65 65 20 2a  *nodeNew(Rtree *
4ff0: 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64  pRtree, RtreeNod
5000: 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 52  e *pParent){.  R
5010: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  treeNode *pNode;
5020: 0a 20 20 70 4e 6f 64 65 20 3d 20 28 52 74 72 65  .  pNode = (Rtre
5030: 65 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33 5f  eNode *)sqlite3_
5040: 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
5050: 52 74 72 65 65 4e 6f 64 65 29 20 2b 20 70 52 74  RtreeNode) + pRt
5060: 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b  ree->iNodeSize);
5070: 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a  .  if( pNode ){.
5080: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 6f 64 65      memset(pNode
5090: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  , 0, sizeof(Rtre
50a0: 65 4e 6f 64 65 29 20 2b 20 70 52 74 72 65 65 2d  eNode) + pRtree-
50b0: 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20  >iNodeSize);.   
50c0: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20   pNode->zData = 
50d0: 28 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b  (u8 *)&pNode[1];
50e0: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66  .    pNode->nRef
50f0: 20 3d 20 31 3b 0a 20 20 20 20 70 52 74 72 65 65   = 1;.    pRtree
5100: 2d 3e 6e 4e 6f 64 65 52 65 66 2b 2b 3b 0a 20 20  ->nNodeRef++;.  
5110: 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
5120: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
5130: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
5140: 20 31 3b 0a 20 20 20 20 6e 6f 64 65 52 65 66 65   1;.    nodeRefe
5150: 72 65 6e 63 65 28 70 50 61 72 65 6e 74 29 3b 0a  rence(pParent);.
5160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f    }.  return pNo
5170: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  de;.}../*.** Cle
5180: 61 72 20 74 68 65 20 52 74 72 65 65 2e 70 4e 6f  ar the Rtree.pNo
5190: 64 65 42 6c 6f 62 20 6f 62 6a 65 63 74 0a 2a 2f  deBlob object.*/
51a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64  .static void nod
51b0: 65 42 6c 6f 62 52 65 73 65 74 28 52 74 72 65 65  eBlobReset(Rtree
51c0: 20 2a 70 52 74 72 65 65 29 7b 0a 20 20 69 66 28   *pRtree){.  if(
51d0: 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c   pRtree->pNodeBl
51e0: 6f 62 20 26 26 20 70 52 74 72 65 65 2d 3e 69 6e  ob && pRtree->in
51f0: 57 72 54 72 61 6e 73 3d 3d 30 20 26 26 20 70 52  WrTrans==0 && pR
5200: 74 72 65 65 2d 3e 6e 43 75 72 73 6f 72 3d 3d 30  tree->nCursor==0
5210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5220: 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 52  blob *pBlob = pR
5230: 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 3b  tree->pNodeBlob;
5240: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 70 4e 6f  .    pRtree->pNo
5250: 64 65 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20  deBlob = 0;.    
5260: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5270: 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 7d  se(pBlob);.  }.}
5280: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
5290: 20 73 65 65 20 69 66 20 70 4e 6f 64 65 20 69 73   see if pNode is
52a0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 70 50 61   the same as pPa
52b0: 72 65 6e 74 20 6f 72 20 61 6e 79 20 6f 66 20 74  rent or any of t
52c0: 68 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 6f 66  he parents.** of
52d0: 20 70 50 61 72 65 6e 74 2e 0a 2a 2f 0a 73 74 61   pParent..*/.sta
52e0: 74 69 63 20 69 6e 74 20 6e 6f 64 65 49 6e 50 61  tic int nodeInPa
52f0: 72 65 6e 74 43 68 61 69 6e 28 63 6f 6e 73 74 20  rentChain(const 
5300: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
5310: 2c 20 63 6f 6e 73 74 20 52 74 72 65 65 4e 6f 64  , const RtreeNod
5320: 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 64  e *pParent){.  d
5330: 6f 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  o{.    if( pNode
5340: 3d 3d 70 50 61 72 65 6e 74 20 29 20 72 65 74 75  ==pParent ) retu
5350: 72 6e 20 31 3b 0a 20 20 20 20 70 50 61 72 65 6e  rn 1;.    pParen
5360: 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 50 61  t = pParent->pPa
5370: 72 65 6e 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  rent;.  }while( 
5380: 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 72 65 74  pParent );.  ret
5390: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
53a0: 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
53b0: 63 65 20 74 6f 20 61 6e 20 72 2d 74 72 65 65 20  ce to an r-tree 
53c0: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
53d0: 69 6e 74 20 6e 6f 64 65 41 63 71 75 69 72 65 28  int nodeAcquire(
53e0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5400: 20 52 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   R-tree structur
5410: 65 20 2a 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65  e */.  i64 iNode
5420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5430: 20 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72    /* Node number
5440: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 52 74   to load */.  Rt
5450: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
5460: 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74 68  ,        /* Eith
5470: 65 72 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  er the parent no
5480: 64 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  de or NULL */.  
5490: 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4e 6f  RtreeNode **ppNo
54a0: 64 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  de         /* OU
54b0: 54 3a 20 41 63 71 75 69 72 65 64 20 6e 6f 64 65  T: Acquired node
54c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
54d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
54e0: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  treeNode *pNode 
54f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
5500: 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
5510: 64 20 6e 6f 64 65 20 69 73 20 61 6c 72 65 61 64  d node is alread
5520: 79 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  y in the hash ta
5530: 62 6c 65 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ble. If so,.  **
5540: 20 69 6e 63 72 65 61 73 65 20 69 74 73 20 72 65   increase its re
5550: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
5560: 64 20 72 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a  d return it..  *
5570: 2f 0a 20 20 69 66 28 20 28 70 4e 6f 64 65 20 3d  /.  if( (pNode =
5580: 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70 28   nodeHashLookup(
5590: 70 52 74 72 65 65 2c 20 69 4e 6f 64 65 29 29 21  pRtree, iNode))!
55a0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
55b0: 28 20 21 70 50 61 72 65 6e 74 20 7c 7c 20 21 70  ( !pParent || !p
55c0: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 7c 7c  Node->pParent ||
55d0: 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3d   pNode->pParent=
55e0: 3d 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 20 20  =pParent );.    
55f0: 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 21  if( pParent && !
5600: 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 29  pNode->pParent )
5610: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 64 65  {.      if( node
5620: 49 6e 50 61 72 65 6e 74 43 68 61 69 6e 28 70 4e  InParentChain(pN
5630: 6f 64 65 2c 20 70 50 61 72 65 6e 74 29 20 29 7b  ode, pParent) ){
5640: 0a 20 20 20 20 20 20 20 20 52 54 52 45 45 5f 49  .        RTREE_I
5650: 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65 65  S_CORRUPT(pRtree
5660: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
5670: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5680: 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20  _VTAB;.      }. 
5690: 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 52       pParent->nR
56a0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ef++;.      pNod
56b0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e->pParent = pPa
56c0: 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rent;.    }.    
56d0: 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pNode->nRef++;. 
56e0: 20 20 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f     *ppNode = pNo
56f0: 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  de;.    return S
5700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5710: 20 69 66 28 20 70 52 74 72 65 65 2d 3e 70 4e 6f   if( pRtree->pNo
5720: 64 65 42 6c 6f 62 20 29 7b 0a 20 20 20 20 73 71  deBlob ){.    sq
5730: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
5740: 62 20 3d 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64  b = pRtree->pNod
5750: 65 42 6c 6f 62 3b 0a 20 20 20 20 70 52 74 72 65  eBlob;.    pRtre
5760: 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 20 3d 20 30  e->pNodeBlob = 0
5770: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
5780: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
5790: 42 6c 6f 62 2c 20 69 4e 6f 64 65 29 3b 0a 20 20  Blob, iNode);.  
57a0: 20 20 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42    pRtree->pNodeB
57b0: 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20  lob = pBlob;.   
57c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
57d0: 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70   nodeBlobReset(p
57e0: 52 74 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  Rtree);.      if
57f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
5800: 45 4d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  EM ) return SQLI
5810: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
5820: 20 20 7d 0a 20 20 69 66 28 20 70 52 74 72 65 65    }.  if( pRtree
5830: 2d 3e 70 4e 6f 64 65 42 6c 6f 62 3d 3d 30 20 29  ->pNodeBlob==0 )
5840: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
5850: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5860: 74 66 28 22 25 73 5f 6e 6f 64 65 22 2c 20 70 52  tf("%s_node", pR
5870: 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  tree->zName);.  
5880: 20 20 69 66 28 20 7a 54 61 62 3d 3d 30 20 29 20    if( zTab==0 ) 
5890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
58a0: 4d 45 4d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  MEM;.    rc = sq
58b0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
58c0: 70 52 74 72 65 65 2d 3e 64 62 2c 20 70 52 74 72  pRtree->db, pRtr
58d0: 65 65 2d 3e 7a 44 62 2c 20 7a 54 61 62 2c 20 22  ee->zDb, zTab, "
58e0: 64 61 74 61 22 2c 20 69 4e 6f 64 65 2c 20 30 2c  data", iNode, 0,
58f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5900: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 52 74              &pRt
5910: 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 29 3b  ree->pNodeBlob);
5920: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5930: 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 69  e(zTab);.  }.  i
5940: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 6e 6f 64  f( rc ){.    nod
5950: 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65  eBlobReset(pRtre
5960: 65 29 3b 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20  e);.    *ppNode 
5970: 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 75  = 0;.    /* If u
5980: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 6e  nable to open an
5990: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 6f 6e   sqlite3_blob on
59a0: 20 74 68 65 20 64 65 73 69 72 65 64 20 72 6f 77   the desired row
59b0: 2c 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 0a  , that can only.
59c0: 20 20 20 20 2a 2a 20 62 65 20 62 65 63 61 75 73      ** be becaus
59d0: 65 20 74 68 65 20 73 68 61 64 6f 77 20 74 61 62  e the shadow tab
59e0: 6c 65 73 20 68 6f 6c 64 20 65 72 72 6f 6e 65 6f  les hold erroneo
59f0: 75 73 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  us data. */.    
5a00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
5a10: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 72 63  RROR ){.      rc
5a20: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
5a30: 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 52 54  T_VTAB;.      RT
5a40: 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54 28 70  REE_IS_CORRUPT(p
5a50: 52 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Rtree);.    }.  
5a60: 7d 65 6c 73 65 20 69 66 28 20 70 52 74 72 65 65  }else if( pRtree
5a70: 2d 3e 69 4e 6f 64 65 53 69 7a 65 3d 3d 73 71 6c  ->iNodeSize==sql
5a80: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
5a90: 70 52 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f  pRtree->pNodeBlo
5aa0: 62 29 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 20  b) ){.    pNode 
5ab0: 3d 20 28 52 74 72 65 65 4e 6f 64 65 20 2a 29 73  = (RtreeNode *)s
5ac0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
5ad0: 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
5ae0: 29 2b 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  )+pRtree->iNodeS
5af0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
5b00: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Node ){.      rc
5b10: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5b20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5b30: 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
5b40: 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
5b50: 20 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d    pNode->zData =
5b60: 20 28 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d   (u8 *)&pNode[1]
5b70: 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6e  ;.      pNode->n
5b80: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
5b90: 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 2b  Rtree->nNodeRef+
5ba0: 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  +;.      pNode->
5bb0: 69 4e 6f 64 65 20 3d 20 69 4e 6f 64 65 3b 0a 20  iNode = iNode;. 
5bc0: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69       pNode->isDi
5bd0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
5be0: 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Node->pNext = 0;
5bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5c00: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 52  te3_blob_read(pR
5c10: 74 72 65 65 2d 3e 70 4e 6f 64 65 42 6c 6f 62 2c  tree->pNodeBlob,
5c20: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 2c 0a 20   pNode->zData,. 
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 74 72              pRtr
5c50: 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 2c 20 30  ee->iNodeSize, 0
5c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5c70: 2f 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e  /* If the root n
5c80: 6f 64 65 20 77 61 73 20 6a 75 73 74 20 6c 6f 61  ode was just loa
5c90: 64 65 64 2c 20 73 65 74 20 70 52 74 72 65 65 2d  ded, set pRtree-
5ca0: 3e 69 44 65 70 74 68 20 74 6f 20 74 68 65 20 68  >iDepth to the h
5cb0: 65 69 67 68 74 0a 20 20 2a 2a 20 6f 66 20 74 68  eight.  ** of th
5cc0: 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
5cd0: 72 65 2e 20 41 20 68 65 69 67 68 74 20 6f 66 20  re. A height of 
5ce0: 7a 65 72 6f 20 6d 65 61 6e 73 20 61 6c 6c 20 64  zero means all d
5cf0: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e  ata is stored on
5d00: 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e  .  ** the root n
5d10: 6f 64 65 2e 20 41 20 68 65 69 67 68 74 20 6f 66  ode. A height of
5d20: 20 6f 6e 65 20 6d 65 61 6e 73 20 74 68 65 20 63   one means the c
5d30: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 72  hildren of the r
5d40: 6f 6f 74 20 6e 6f 64 65 0a 20 20 2a 2a 20 61 72  oot node.  ** ar
5d50: 65 20 74 68 65 20 6c 65 61 76 65 73 2c 20 61 6e  e the leaves, an
5d60: 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65 20  d so on. If the 
5d70: 64 65 70 74 68 20 61 73 20 73 70 65 63 69 66 69  depth as specifi
5d80: 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ed on the root n
5d90: 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 72 65 61  ode.  ** is grea
5da0: 74 65 72 20 74 68 61 6e 20 52 54 52 45 45 5f 4d  ter than RTREE_M
5db0: 41 58 5f 44 45 50 54 48 2c 20 74 68 65 20 72 2d  AX_DEPTH, the r-
5dc0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 6d  tree structure m
5dd0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 0a  ust be corrupt..
5de0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 6f 64 65    */.  if( pNode
5df0: 20 26 26 20 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a   && iNode==1 ){.
5e00: 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70      pRtree->iDep
5e10: 74 68 20 3d 20 72 65 61 64 49 6e 74 31 36 28 70  th = readInt16(p
5e20: 4e 6f 64 65 2d 3e 7a 44 61 74 61 29 3b 0a 20 20  Node->zData);.  
5e30: 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 69 44    if( pRtree->iD
5e40: 65 70 74 68 3e 52 54 52 45 45 5f 4d 41 58 5f 44  epth>RTREE_MAX_D
5e50: 45 50 54 48 20 29 7b 0a 20 20 20 20 20 20 72 63  EPTH ){.      rc
5e60: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
5e70: 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 52 54  T_VTAB;.      RT
5e80: 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54 28 70  REE_IS_CORRUPT(p
5e90: 52 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Rtree);.    }.  
5ea0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  }..  /* If no er
5eb0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
5ec0: 20 73 6f 20 66 61 72 2c 20 63 68 65 63 6b 20 69   so far, check i
5ed0: 66 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  f the "number of
5ee0: 20 65 6e 74 72 69 65 73 22 0a 20 20 2a 2a 20 66   entries".  ** f
5ef0: 69 65 6c 64 20 6f 6e 20 74 68 65 20 6e 6f 64 65  ield on the node
5f00: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2e 20 49   is too large. I
5f10: 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 72 65  f so, set the re
5f20: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 0a 20 20  turn code to .  
5f30: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
5f40: 54 5f 56 54 41 42 2e 0a 20 20 2a 2f 0a 20 20 69  T_VTAB..  */.  i
5f50: 66 28 20 70 4e 6f 64 65 20 26 26 20 72 63 3d 3d  f( pNode && rc==
5f60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f70: 20 69 66 28 20 4e 43 45 4c 4c 28 70 4e 6f 64 65   if( NCELL(pNode
5f80: 29 3e 28 28 70 52 74 72 65 65 2d 3e 69 4e 6f 64  )>((pRtree->iNod
5f90: 65 53 69 7a 65 2d 34 29 2f 70 52 74 72 65 65 2d  eSize-4)/pRtree-
5fa0: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 29 20  >nBytesPerCell) 
5fb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
5fd0: 42 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 49  B;.      RTREE_I
5fe0: 53 5f 43 4f 52 52 55 50 54 28 70 52 74 72 65 65  S_CORRUPT(pRtree
5ff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
6000: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6010: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f  K ){.    if( pNo
6020: 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  de!=0 ){.      n
6030: 6f 64 65 52 65 66 65 72 65 6e 63 65 28 70 50 61  odeReference(pPa
6040: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64  rent);.      nod
6050: 65 48 61 73 68 49 6e 73 65 72 74 28 70 52 74 72  eHashInsert(pRtr
6060: 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20  ee, pNode);.    
6070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6080: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6090: 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 52 54 52  _VTAB;.      RTR
60a0: 45 45 5f 49 53 5f 43 4f 52 52 55 50 54 28 70 52  EE_IS_CORRUPT(pR
60b0: 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tree);.    }.   
60c0: 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65   *ppNode = pNode
60d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
60e0: 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20  f( pNode ){.    
60f0: 20 20 70 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52    pRtree->nNodeR
6100: 65 66 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ef--;.      sqli
6110: 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b  te3_free(pNode);
6120: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4e 6f  .    }.    *ppNo
6130: 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  de = 0;.  }..  r
6140: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6150: 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 63 65 6c  ** Overwrite cel
6160: 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f 64 65 20  l iCell of node 
6170: 70 4e 6f 64 65 20 77 69 74 68 20 74 68 65 20 63  pNode with the c
6180: 6f 6e 74 65 6e 74 73 20 6f 66 20 70 43 65 6c 6c  ontents of pCell
6190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
61a0: 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65   nodeOverwriteCe
61b0: 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ll(.  Rtree *pRt
61c0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
61d0: 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20   /* The overall 
61e0: 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65  R-Tree */.  Rtre
61f0: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  eNode *pNode,   
6200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
6210: 64 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 68  de into which th
6220: 65 20 63 65 6c 6c 20 69 73 20 74 6f 20 62 65 20  e cell is to be 
6230: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 52 74 72  written */.  Rtr
6240: 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20  eeCell *pCell,  
6250: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
6260: 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  ell to write */.
6270: 20 20 69 6e 74 20 69 43 65 6c 6c 20 20 20 20 20    int iCell     
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6290: 49 6e 64 65 78 20 69 6e 74 6f 20 70 4e 6f 64 65  Index into pNode
62a0: 20 69 6e 74 6f 20 77 68 69 63 68 20 70 43 65 6c   into which pCel
62b0: 6c 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  l is written */.
62c0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 75  ){.  int ii;.  u
62d0: 38 20 2a 70 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a  8 *p = &pNode->z
62e0: 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65 65 2d  Data[4 + pRtree-
62f0: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69  >nBytesPerCell*i
6300: 43 65 6c 6c 5d 3b 0a 20 20 70 20 2b 3d 20 77 72  Cell];.  p += wr
6310: 69 74 65 49 6e 74 36 34 28 70 2c 20 70 43 65 6c  iteInt64(p, pCel
6320: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 66 6f  l->iRowid);.  fo
6330: 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65  r(ii=0; ii<pRtre
6340: 65 2d 3e 6e 44 69 6d 32 3b 20 69 69 2b 2b 29 7b  e->nDim2; ii++){
6350: 0a 20 20 20 20 70 20 2b 3d 20 77 72 69 74 65 43  .    p += writeC
6360: 6f 6f 72 64 28 70 2c 20 26 70 43 65 6c 6c 2d 3e  oord(p, &pCell->
6370: 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a 20 20 7d  aCoord[ii]);.  }
6380: 0a 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74  .  pNode->isDirt
6390: 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 1;.}../*.** 
63a0: 52 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20  Remove the cell 
63b0: 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c  with index iCell
63c0: 20 66 72 6f 6d 20 6e 6f 64 65 20 70 4e 6f 64 65   from node pNode
63d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63e0: 20 6e 6f 64 65 44 65 6c 65 74 65 43 65 6c 6c 28   nodeDeleteCell(
63f0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
6400: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
6410: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
6420: 38 20 2a 70 44 73 74 20 3d 20 26 70 4e 6f 64 65  8 *pDst = &pNode
6430: 2d 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52 74 72  ->zData[4 + pRtr
6440: 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  ee->nBytesPerCel
6450: 6c 2a 69 43 65 6c 6c 5d 3b 0a 20 20 75 38 20 2a  l*iCell];.  u8 *
6460: 70 53 72 63 20 3d 20 26 70 44 73 74 5b 70 52 74  pSrc = &pDst[pRt
6470: 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65  ree->nBytesPerCe
6480: 6c 6c 5d 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ll];.  int nByte
6490: 20 3d 20 28 4e 43 45 4c 4c 28 70 4e 6f 64 65 29   = (NCELL(pNode)
64a0: 20 2d 20 69 43 65 6c 6c 20 2d 20 31 29 20 2a 20   - iCell - 1) * 
64b0: 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
64c0: 72 43 65 6c 6c 3b 0a 20 20 6d 65 6d 6d 6f 76 65  rCell;.  memmove
64d0: 28 70 44 73 74 2c 20 70 53 72 63 2c 20 6e 42 79  (pDst, pSrc, nBy
64e0: 74 65 29 3b 0a 20 20 77 72 69 74 65 49 6e 74 31  te);.  writeInt1
64f0: 36 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  6(&pNode->zData[
6500: 32 5d 2c 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29  2], NCELL(pNode)
6510: 2d 31 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69 73  -1);.  pNode->is
6520: 44 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Dirty = 1;.}../*
6530: 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63  .** Insert the c
6540: 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20  ontents of cell 
6550: 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65 20  pCell into node 
6560: 70 4e 6f 64 65 2e 20 49 66 20 74 68 65 20 69 6e  pNode. If the in
6570: 73 65 72 74 0a 2a 2a 20 69 73 20 73 75 63 63 65  sert.** is succe
6580: 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
6590: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
65a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  f there is not e
65b0: 6e 6f 75 67 68 20 66 72 65 65 20 73 70 61 63 65  nough free space
65c0: 20 69 6e 20 70 4e 6f 64 65 2c 20 72 65 74 75 72   in pNode, retur
65d0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
65e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64  /.static int nod
65f0: 65 49 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 52  eInsertCell(.  R
6600: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20  tree *pRtree,   
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6620: 54 68 65 20 6f 76 65 72 61 6c 6c 20 52 2d 54 72  The overall R-Tr
6630: 65 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64  ee */.  RtreeNod
6640: 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20  e *pNode,       
6650: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
6660: 65 77 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 69  ew cell into thi
6670: 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 52 74 72 65  s node */.  Rtre
6680: 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 20 20 20  eCell *pCell    
6690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
66a0: 20 63 65 6c 6c 20 74 6f 20 62 65 20 69 6e 73 65   cell to be inse
66b0: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rted */.){.  int
66c0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
66d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
66e0: 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
66f0: 63 65 6c 6c 73 20 69 6e 20 70 4e 6f 64 65 20 2a  cells in pNode *
6700: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
6710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6720: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
6730: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 66 6f 72  ber of cells for
6740: 20 70 4e 6f 64 65 20 2a 2f 0a 0a 20 20 6e 4d 61   pNode */..  nMa
6750: 78 43 65 6c 6c 20 3d 20 28 70 52 74 72 65 65 2d  xCell = (pRtree-
6760: 3e 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 70 52  >iNodeSize-4)/pR
6770: 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
6780: 65 6c 6c 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e  ell;.  nCell = N
6790: 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a 20 20  CELL(pNode);..  
67a0: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 3d 6e  assert( nCell<=n
67b0: 4d 61 78 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  MaxCell );.  if(
67c0: 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 20   nCell<nMaxCell 
67d0: 29 7b 0a 20 20 20 20 6e 6f 64 65 4f 76 65 72 77  ){.    nodeOverw
67e0: 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c  riteCell(pRtree,
67f0: 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c 20 6e   pNode, pCell, n
6800: 43 65 6c 6c 29 3b 0a 20 20 20 20 77 72 69 74 65  Cell);.    write
6810: 49 6e 74 31 36 28 26 70 4e 6f 64 65 2d 3e 7a 44  Int16(&pNode->zD
6820: 61 74 61 5b 32 5d 2c 20 6e 43 65 6c 6c 2b 31 29  ata[2], nCell+1)
6830: 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44  ;.    pNode->isD
6840: 69 72 74 79 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  irty = 1;.  }.. 
6850: 20 72 65 74 75 72 6e 20 28 6e 43 65 6c 6c 3d 3d   return (nCell==
6860: 6e 4d 61 78 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  nMaxCell);.}../*
6870: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20  .** If the node 
6880: 69 73 20 64 69 72 74 79 2c 20 77 72 69 74 65 20  is dirty, write 
6890: 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  it out to the da
68a0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
68b0: 63 20 69 6e 74 20 6e 6f 64 65 57 72 69 74 65 28  c int nodeWrite(
68c0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
68d0: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29  treeNode *pNode)
68e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
68f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 4e  ITE_OK;.  if( pN
6900: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 29 7b 0a  ode->isDirty ){.
6910: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
6920: 20 2a 70 20 3d 20 70 52 74 72 65 65 2d 3e 70 57   *p = pRtree->pW
6930: 72 69 74 65 4e 6f 64 65 3b 0a 20 20 20 20 69 66  riteNode;.    if
6940: 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 29  ( pNode->iNode )
6950: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6960: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2c 20 31 2c  bind_int64(p, 1,
6970: 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a   pNode->iNode);.
6980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6990: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
69a0: 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ll(p, 1);.    }.
69b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
69c0: 5f 62 6c 6f 62 28 70 2c 20 32 2c 20 70 4e 6f 64  _blob(p, 2, pNod
69d0: 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72 65 65  e->zData, pRtree
69e0: 2d 3e 69 4e 6f 64 65 53 69 7a 65 2c 20 53 51 4c  ->iNodeSize, SQL
69f0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
6a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 29   sqlite3_step(p)
6a10: 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44  ;.    pNode->isD
6a20: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
6a30: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
6a40: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
6a50: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2c 20 32 29  _bind_null(p, 2)
6a60: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ;.    if( pNode-
6a70: 3e 69 4e 6f 64 65 3d 3d 30 20 26 26 20 72 63 3d  >iNode==0 && rc=
6a80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6a90: 20 20 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65      pNode->iNode
6aa0: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
6ab0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 52 74  insert_rowid(pRt
6ac0: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
6ad0: 6e 6f 64 65 48 61 73 68 49 6e 73 65 72 74 28 70  nodeHashInsert(p
6ae0: 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
6af0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6b00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6b10: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
6b20: 63 65 20 74 6f 20 61 20 6e 6f 64 65 2e 20 49 66  ce to a node. If
6b30: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 64 69 72   the node is dir
6b40: 74 79 20 61 6e 64 20 74 68 65 20 72 65 66 65 72  ty and the refer
6b50: 65 6e 63 65 0a 2a 2a 20 63 6f 75 6e 74 20 64 72  ence.** count dr
6b60: 6f 70 73 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ops to zero, the
6b70: 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 77 72   node data is wr
6b80: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
6b90: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
6ba0: 20 69 6e 74 20 6e 6f 64 65 52 65 6c 65 61 73 65   int nodeRelease
6bb0: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
6bc0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
6bd0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
6be0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
6bf0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Node ){.    asse
6c00: 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 3e  rt( pNode->nRef>
6c10: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
6c20: 20 70 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65   pRtree->nNodeRe
6c30: 66 3e 30 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65  f>0 );.    pNode
6c40: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6c50: 28 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ( pNode->nRef==0
6c60: 20 29 7b 0a 20 20 20 20 20 20 70 52 74 72 65 65   ){.      pRtree
6c70: 2d 3e 6e 4e 6f 64 65 52 65 66 2d 2d 3b 0a 20 20  ->nNodeRef--;.  
6c80: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69      if( pNode->i
6c90: 4e 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Node==1 ){.     
6ca0: 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74     pRtree->iDept
6cb0: 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  h = -1;.      }.
6cc0: 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d        if( pNode-
6cd0: 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  >pParent ){.    
6ce0: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c      rc = nodeRel
6cf0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  ease(pRtree, pNo
6d00: 64 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  de->pParent);.  
6d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  .        rc = no
6d40: 64 65 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  deWrite(pRtree, 
6d50: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pNode);.      }.
6d60: 20 20 20 20 20 20 6e 6f 64 65 48 61 73 68 44 65        nodeHashDe
6d70: 6c 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  lete(pRtree, pNo
6d80: 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  de);.      sqlit
6d90: 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b 0a  e3_free(pNode);.
6da0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6db0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6dc0: 52 65 74 75 72 6e 20 74 68 65 20 36 34 2d 62 69  Return the 64-bi
6dd0: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
6de0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6df0: 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 0a 2a 2a  cell iCell of.**
6e00: 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49 66 20   node pNode. If 
6e10: 70 4e 6f 64 65 20 69 73 20 61 20 6c 65 61 66 20  pNode is a leaf 
6e20: 6e 6f 64 65 2c 20 74 68 69 73 20 69 73 20 61 20  node, this is a 
6e30: 72 6f 77 69 64 2e 20 49 66 20 69 74 20 69 73 0a  rowid. If it is.
6e40: 2a 2a 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  ** an internal n
6e50: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 36 34  ode, then the 64
6e60: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 20  -bit integer is 
6e70: 61 20 63 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  a child page num
6e80: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ber..*/.static i
6e90: 36 34 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28  64 nodeGetRowid(
6ea0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
6eb0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
6ec0: 76 65 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f  verall R-Tree */
6ed0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  .  RtreeNode *pN
6ee0: 6f 64 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  ode,    /* The n
6ef0: 6f 64 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ode from which t
6f00: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 49 44  o extract the ID
6f10: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20   */.  int iCell 
6f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6f30: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 66 72 6f  e cell index fro
6f40: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
6f50: 63 74 20 74 68 65 20 49 44 20 2a 2f 0a 29 7b 0a  ct the ID */.){.
6f60: 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c    assert( iCell<
6f70: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 20 29 3b 0a  NCELL(pNode) );.
6f80: 20 20 72 65 74 75 72 6e 20 72 65 61 64 49 6e 74    return readInt
6f90: 36 34 28 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61  64(&pNode->zData
6fa0: 5b 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79  [4 + pRtree->nBy
6fb0: 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c  tesPerCell*iCell
6fc0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ]);.}../*.** Ret
6fd0: 75 72 6e 20 63 6f 6f 72 64 69 6e 61 74 65 20 69  urn coordinate i
6fe0: 43 6f 6f 72 64 20 66 72 6f 6d 20 63 65 6c 6c 20  Coord from cell 
6ff0: 69 43 65 6c 6c 20 69 6e 20 6e 6f 64 65 20 70 4e  iCell in node pN
7000: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
7010: 6f 69 64 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64  oid nodeGetCoord
7020: 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
7030: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7040: 20 2f 2a 20 54 68 65 20 6f 76 65 72 61 6c 6c 20   /* The overall 
7050: 52 2d 54 72 65 65 20 2a 2f 0a 20 20 52 74 72 65  R-Tree */.  Rtre
7060: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  eNode *pNode,   
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7080: 6e 6f 64 65 20 66 72 6f 6d 20 77 68 69 63 68 20  node from which 
7090: 74 6f 20 65 78 74 72 61 63 74 20 61 20 63 6f 6f  to extract a coo
70a0: 72 64 69 6e 61 74 65 20 2a 2f 0a 20 20 69 6e 74  rdinate */.  int
70b0: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
70c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
70d0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65   index of the ce
70e0: 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  ll within the no
70f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f  de */.  int iCoo
7100: 72 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rd,             
7110: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
7120: 6f 72 64 69 6e 61 74 65 20 74 6f 20 65 78 74 72  ordinate to extr
7130: 61 63 74 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f  act */.  RtreeCo
7140: 6f 72 64 20 2a 70 43 6f 6f 72 64 20 20 20 20 20  ord *pCoord     
7150: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 70        /* OUT: Sp
7160: 61 63 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ace to write res
7170: 75 6c 74 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 72  ult to */.){.  r
7180: 65 61 64 43 6f 6f 72 64 28 26 70 4e 6f 64 65 2d  eadCoord(&pNode-
7190: 3e 7a 44 61 74 61 5b 31 32 20 2b 20 70 52 74 72  >zData[12 + pRtr
71a0: 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c  ee->nBytesPerCel
71b0: 6c 2a 69 43 65 6c 6c 20 2b 20 34 2a 69 43 6f 6f  l*iCell + 4*iCoo
71c0: 72 64 5d 2c 20 70 43 6f 6f 72 64 29 3b 0a 7d 0a  rd], pCoord);.}.
71d0: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
71e0: 7a 65 20 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66  ze cell iCell of
71f0: 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 50 6f 70   node pNode. Pop
7200: 75 6c 61 74 65 20 74 68 65 20 73 74 72 75 63 74  ulate the struct
7210: 75 72 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  ure pointed.** t
7220: 6f 20 62 79 20 70 43 65 6c 6c 20 77 69 74 68 20  o by pCell with 
7230: 74 68 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  the results..*/.
7240: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65  static void node
7250: 47 65 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65  GetCell(.  Rtree
7260: 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20   *pRtree,       
7270: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
7280: 76 65 72 61 6c 6c 20 52 2d 54 72 65 65 20 2a 2f  verall R-Tree */
7290: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  .  RtreeNode *pN
72a0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
72b0: 2f 2a 20 54 68 65 20 6e 6f 64 65 20 63 6f 6e 74  /* The node cont
72c0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
72d0: 74 6f 20 62 65 20 72 65 61 64 20 2a 2f 0a 20 20  to be read */.  
72e0: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7300: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65 6c  Index of the cel
7310: 6c 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64  l within the nod
7320: 65 20 2a 2f 0a 20 20 52 74 72 65 65 43 65 6c 6c  e */.  RtreeCell
7330: 20 2a 70 43 65 6c 6c 20 20 20 20 20 20 20 20 20   *pCell         
7340: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74      /* OUT: Writ
7350: 65 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  e the cell conte
7360: 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  nts here */.){. 
7370: 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 52 74   u8 *pData;.  Rt
7380: 72 65 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64  reeCoord *pCoord
7390: 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 30 3b 0a  ;.  int ii = 0;.
73a0: 20 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 20    pCell->iRowid 
73b0: 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70  = nodeGetRowid(p
73c0: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43  Rtree, pNode, iC
73d0: 65 6c 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20  ell);.  pData = 
73e0: 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 2b 20 28  pNode->zData + (
73f0: 31 32 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79  12 + pRtree->nBy
7400: 74 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c  tesPerCell*iCell
7410: 29 3b 0a 20 20 70 43 6f 6f 72 64 20 3d 20 70 43  );.  pCoord = pC
7420: 65 6c 6c 2d 3e 61 43 6f 6f 72 64 3b 0a 20 20 64  ell->aCoord;.  d
7430: 6f 7b 0a 20 20 20 20 72 65 61 64 43 6f 6f 72 64  o{.    readCoord
7440: 28 70 44 61 74 61 2c 20 26 70 43 6f 6f 72 64 5b  (pData, &pCoord[
7450: 69 69 5d 29 3b 0a 20 20 20 20 72 65 61 64 43 6f  ii]);.    readCo
7460: 6f 72 64 28 70 44 61 74 61 2b 34 2c 20 26 70 43  ord(pData+4, &pC
7470: 6f 6f 72 64 5b 69 69 2b 31 5d 29 3b 0a 20 20 20  oord[ii+1]);.   
7480: 20 70 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20 20   pData += 8;.   
7490: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 7d 77 68 69   ii += 2;.  }whi
74a0: 6c 65 28 20 69 69 3c 70 52 74 72 65 65 2d 3e 6e  le( ii<pRtree->n
74b0: 44 69 6d 32 20 29 3b 0a 7d 0a 0a 0a 2f 2a 20 46  Dim2 );.}.../* F
74c0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
74d0: 6f 6e 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74  on for the funct
74e0: 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68  ion that does th
74f0: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 74 68 65  e work of.** the
7500: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
7510: 6f 64 75 6c 65 20 78 43 72 65 61 74 65 28 29 20  odule xCreate() 
7520: 61 6e 64 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d  and xConnect() m
7530: 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
7540: 63 20 69 6e 74 20 72 74 72 65 65 49 6e 69 74 28  c int rtreeInit(
7550: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2c 20 76 6f  .  sqlite3 *, vo
7560: 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  id *, int, const
7570: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 2c 20 73   char *const*, s
7580: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 2c 20  qlite3_vtab **, 
7590: 63 68 61 72 20 2a 2a 2c 20 69 6e 74 0a 29 3b 0a  char **, int.);.
75a0: 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69  ./* .** Rtree vi
75b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
75c0: 6c 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  le xCreate metho
75d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
75e0: 20 72 74 72 65 65 43 72 65 61 74 65 28 0a 20 20   rtreeCreate(.  
75f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
7600: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
7610: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
7620: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
7630: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
7640: 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVtab,.  char *
7650: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
7660: 72 6e 20 72 74 72 65 65 49 6e 69 74 28 64 62 2c  rn rtreeInit(db,
7670: 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
7680: 76 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72  v, ppVtab, pzErr
7690: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  , 1);.}../* .** 
76a0: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
76b0: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
76c0: 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43  tatic int rtreeC
76e0: 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
76f0: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
7700: 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
7710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
7720: 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
7730: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
7740: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
7750: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 72 74 72  .){.  return rtr
7760: 65 65 49 6e 69 74 28 64 62 2c 20 70 41 75 78 2c  eeInit(db, pAux,
7770: 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56   argc, argv, ppV
7780: 74 61 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a  tab, pzErr, 0);.
7790: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  }../*.** Increme
77a0: 6e 74 20 74 68 65 20 72 2d 74 72 65 65 20 72 65  nt the r-tree re
77b0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 0a 2a  ference count..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
77d0: 72 65 65 52 65 66 65 72 65 6e 63 65 28 52 74 72  reeReference(Rtr
77e0: 65 65 20 2a 70 52 74 72 65 65 29 7b 0a 20 20 70  ee *pRtree){.  p
77f0: 52 74 72 65 65 2d 3e 6e 42 75 73 79 2b 2b 3b 0a  Rtree->nBusy++;.
7800: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7810: 6e 74 20 74 68 65 20 72 2d 74 72 65 65 20 72 65  nt the r-tree re
7820: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 57  ference count. W
7830: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
7840: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 0a  e count reaches.
7850: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 73 74 72 75  ** zero the stru
7860: 63 74 75 72 65 20 69 73 20 64 65 6c 65 74 65 64  cture is deleted
7870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7880: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 52 74   rtreeRelease(Rt
7890: 72 65 65 20 2a 70 52 74 72 65 65 29 7b 0a 20 20  ree *pRtree){.  
78a0: 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 2d 2d 3b  pRtree->nBusy--;
78b0: 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 6e  .  if( pRtree->n
78c0: 42 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Busy==0 ){.    p
78d0: 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73  Rtree->inWrTrans
78e0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
78f0: 28 20 70 52 74 72 65 65 2d 3e 6e 43 75 72 73 6f  ( pRtree->nCurso
7900: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 6f 64 65  r==0 );.    node
7910: 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65  BlobReset(pRtree
7920: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7930: 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 3d  Rtree->nNodeRef=
7940: 3d 30 20 7c 7c 20 70 52 74 72 65 65 2d 3e 62 43  =0 || pRtree->bC
7950: 6f 72 72 75 70 74 20 29 3b 0a 20 20 20 20 73 71  orrupt );.    sq
7960: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
7970: 52 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64  Rtree->pWriteNod
7980: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
7990: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
79a0: 3e 70 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20  >pDeleteNode);. 
79b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
79c0: 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61  ize(pRtree->pRea
79d0: 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  dRowid);.    sql
79e0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52  ite3_finalize(pR
79f0: 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
7a00: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
7a10: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
7a20: 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a  >pDeleteRowid);.
7a30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
7a40: 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 52 65  lize(pRtree->pRe
7a50: 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  adParent);.    s
7a60: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7a70: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
7a80: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
7a90: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72  e3_finalize(pRtr
7aa0: 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e  ee->pDeleteParen
7ab0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
7ac0: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
7ad0: 3e 70 57 72 69 74 65 41 75 78 29 3b 0a 20 20 20  >pWriteAux);.   
7ae0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
7af0: 74 72 65 65 2d 3e 7a 52 65 61 64 41 75 78 53 71  tree->zReadAuxSq
7b00: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
7b10: 66 72 65 65 28 70 52 74 72 65 65 29 3b 0a 20 20  free(pRtree);.  
7b20: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  }.}../* .** Rtre
7b30: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7b40: 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65  module xDisconne
7b50: 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
7b60: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 44 69  atic int rtreeDi
7b70: 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
7b80: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
7b90: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 28 52   rtreeRelease((R
7ba0: 74 72 65 65 20 2a 29 70 56 74 61 62 29 3b 0a 20  tree *)pVtab);. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72  K;.}../* .** Rtr
7bd0: 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ee virtual table
7be0: 20 6d 6f 64 75 6c 65 20 78 44 65 73 74 72 6f 79   module xDestroy
7bf0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
7c00: 69 63 20 69 6e 74 20 72 74 72 65 65 44 65 73 74  ic int rtreeDest
7c10: 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62  roy(sqlite3_vtab
7c20: 20 2a 70 56 74 61 62 29 7b 0a 20 20 52 74 72 65   *pVtab){.  Rtre
7c30: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
7c40: 65 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  ee *)pVtab;.  in
7c50: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43  t rc;.  char *zC
7c60: 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
7c70: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22 44 52  mprintf(.    "DR
7c80: 4f 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25  OP TABLE '%q'.'%
7c90: 71 5f 6e 6f 64 65 27 3b 22 0a 20 20 20 20 22 44  q_node';".    "D
7ca0: 52 4f 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27  ROP TABLE '%q'.'
7cb0: 25 71 5f 72 6f 77 69 64 27 3b 22 0a 20 20 20 20  %q_rowid';".    
7cc0: 22 44 52 4f 50 20 54 41 42 4c 45 20 27 25 71 27  "DROP TABLE '%q'
7cd0: 2e 27 25 71 5f 70 61 72 65 6e 74 27 3b 22 2c 0a  .'%q_parent';",.
7ce0: 20 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c      pRtree->zDb,
7cf0: 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
7d00: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62  .    pRtree->zDb
7d10: 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c  , pRtree->zName,
7d20: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 7a 44 62  .    pRtree->zDb
7d30: 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a  , pRtree->zName.
7d40: 20 20 29 3b 0a 20 20 69 66 28 20 21 7a 43 72 65    );.  if( !zCre
7d50: 61 74 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ate ){.    rc = 
7d60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 42  }else{.    nodeB
7d80: 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65 65 29  lobReset(pRtree)
7d90: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
7da0: 65 33 5f 65 78 65 63 28 70 52 74 72 65 65 2d 3e  e3_exec(pRtree->
7db0: 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
7dc0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7dd0: 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29  e3_free(zCreate)
7de0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7df0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7e00: 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
7e10: 74 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tree);.  }..  re
7e20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
7e30: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
7e40: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 4f   table module xO
7e50: 70 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  pen method..*/.s
7e60: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 4f  tatic int rtreeO
7e70: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
7e80: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
7e90: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
7ea0: 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  pCursor){.  int 
7eb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7ec0: 4d 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  M;.  Rtree *pRtr
7ed0: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56  ee = (Rtree *)pV
7ee0: 54 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73  Tab;.  RtreeCurs
7ef0: 6f 72 20 2a 70 43 73 72 3b 0a 0a 20 20 70 43 73  or *pCsr;..  pCs
7f00: 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72  r = (RtreeCursor
7f10: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
7f20: 63 36 34 28 73 69 7a 65 6f 66 28 52 74 72 65 65  c64(sizeof(Rtree
7f30: 43 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20  Cursor));.  if( 
7f40: 70 43 73 72 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pCsr ){.    mems
7f50: 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
7f60: 6f 66 28 52 74 72 65 65 43 75 72 73 6f 72 29 29  of(RtreeCursor))
7f70: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 62 61 73 65  ;.    pCsr->base
7f80: 2e 70 56 74 61 62 20 3d 20 70 56 54 61 62 3b 0a  .pVtab = pVTab;.
7f90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7fa0: 4f 4b 3b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e  OK;.    pRtree->
7fb0: 6e 43 75 72 73 6f 72 2b 2b 3b 0a 20 20 7d 0a 20  nCursor++;.  }. 
7fc0: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71   *ppCursor = (sq
7fd0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
7fe0: 72 20 2a 29 70 43 73 72 3b 0a 0a 20 20 72 65 74  r *)pCsr;..  ret
7ff0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
8000: 2a 20 46 72 65 65 20 74 68 65 20 52 74 72 65 65  * Free the Rtree
8010: 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69  Cursor.aConstrai
8020: 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 69  nt[] array and i
8030: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a  ts contents..*/.
8040: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
8050: 43 75 72 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74  CursorConstraint
8060: 73 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  s(RtreeCursor *p
8070: 43 73 72 29 7b 0a 20 20 69 66 28 20 70 43 73 72  Csr){.  if( pCsr
8080: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  ->aConstraint ){
8090: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
80c0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 6f  erate through co
80d0: 6e 73 74 72 61 69 6e 74 20 61 72 72 61 79 20 2a  nstraint array *
80e0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
80f0: 3c 70 43 73 72 2d 3e 6e 43 6f 6e 73 74 72 61 69  <pCsr->nConstrai
8100: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
8110: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75  sqlite3_rtree_qu
8120: 65 72 79 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20  ery_info *pInfo 
8130: 3d 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61  = pCsr->aConstra
8140: 69 6e 74 5b 69 5d 2e 70 49 6e 66 6f 3b 0a 20 20  int[i].pInfo;.  
8150: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
8160: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
8170: 66 6f 2d 3e 78 44 65 6c 55 73 65 72 20 29 20 70  fo->xDelUser ) p
8180: 49 6e 66 6f 2d 3e 78 44 65 6c 55 73 65 72 28 70  Info->xDelUser(p
8190: 49 6e 66 6f 2d 3e 70 55 73 65 72 29 3b 0a 20 20  Info->pUser);.  
81a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
81b0: 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ee(pInfo);.     
81c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
81d0: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
81e0: 61 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  aConstraint);.  
81f0: 20 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61    pCsr->aConstra
8200: 69 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  int = 0;.  }.}..
8210: 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72  /* .** Rtree vir
8220: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
8230: 65 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 2e  e xClose method.
8240: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8250: 74 72 65 65 43 6c 6f 73 65 28 73 71 6c 69 74 65  treeClose(sqlite
8260: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
8270: 75 72 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  ur){.  Rtree *pR
8280: 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
8290: 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  (cur->pVtab);.  
82a0: 69 6e 74 20 69 69 3b 0a 20 20 52 74 72 65 65 43  int ii;.  RtreeC
82b0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 52  ursor *pCsr = (R
82c0: 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63 75 72  treeCursor *)cur
82d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 74 72  ;.  assert( pRtr
82e0: 65 65 2d 3e 6e 43 75 72 73 6f 72 3e 30 20 29 3b  ee->nCursor>0 );
82f0: 0a 20 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  .  freeCursorCon
8300: 73 74 72 61 69 6e 74 73 28 70 43 73 72 29 3b 0a  straints(pCsr);.
8310: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
8320: 7a 65 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75  ze(pCsr->pReadAu
8330: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  x);.  sqlite3_fr
8340: 65 65 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74 29  ee(pCsr->aPoint)
8350: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
8360: 3c 52 54 52 45 45 5f 43 41 43 48 45 5f 53 5a 3b  <RTREE_CACHE_SZ;
8370: 20 69 69 2b 2b 29 20 6e 6f 64 65 52 65 6c 65 61   ii++) nodeRelea
8380: 73 65 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d  se(pRtree, pCsr-
8390: 3e 61 4e 6f 64 65 5b 69 69 5d 29 3b 0a 20 20 73  >aNode[ii]);.  s
83a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
83b0: 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 43 75  );.  pRtree->nCu
83c0: 72 73 6f 72 2d 2d 3b 0a 20 20 6e 6f 64 65 42 6c  rsor--;.  nodeBl
83d0: 6f 62 52 65 73 65 74 28 70 52 74 72 65 65 29 3b  obReset(pRtree);
83e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
83f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74  _OK;.}../*.** Rt
8400: 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ree virtual tabl
8410: 65 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65  e module xEof me
8420: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  thod..**.** Retu
8430: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
8440: 68 65 20 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  he cursor does n
8450: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ot currently poi
8460: 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 0a 2a  nt to a valid .*
8470: 2a 20 72 65 63 6f 72 64 20 28 69 2e 65 20 69 66  * record (i.e if
8480: 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69   the scan has fi
8490: 6e 69 73 68 65 64 29 2c 20 6f 72 20 7a 65 72 6f  nished), or zero
84a0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
84b0: 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 45  tatic int rtreeE
84c0: 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
84d0: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
84e0: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73  RtreeCursor *pCs
84f0: 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72  r = (RtreeCursor
8500: 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e   *)cur;.  return
8510: 20 70 43 73 72 2d 3e 61 74 45 4f 46 3b 0a 7d 0a   pCsr->atEOF;.}.
8520: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 72  ./*.** Convert r
8530: 61 77 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65  aw bits from the
8540: 20 6f 6e 2d 64 69 73 6b 20 52 54 72 65 65 20 72   on-disk RTree r
8550: 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 63 6f 6f  ecord into a coo
8560: 72 64 69 6e 61 74 65 20 76 61 6c 75 65 2e 0a 2a  rdinate value..*
8570: 2a 20 54 68 65 20 6f 6e 2d 64 69 73 6b 20 66 6f  * The on-disk fo
8580: 72 6d 61 74 20 69 73 20 62 69 67 2d 65 6e 64 69  rmat is big-endi
8590: 61 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  an and needs to 
85a0: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 66 6f 72  be converted for
85b0: 20 6c 69 74 74 6c 65 2d 0a 2a 2a 20 65 6e 64 69   little-.** endi
85c0: 61 6e 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 54  an platforms.  T
85d0: 68 65 20 6f 6e 2d 64 69 73 6b 20 72 65 63 6f 72  he on-disk recor
85e0: 64 20 73 74 6f 72 65 73 20 69 6e 74 65 67 65 72  d stores integer
85f0: 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 69 66 0a   coordinates if.
8600: 2a 2a 20 65 49 6e 74 20 69 73 20 74 72 75 65 20  ** eInt is true 
8610: 61 6e 64 20 69 74 20 73 74 6f 72 65 73 20 33 32  and it stores 32
8620: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
8630: 69 6e 74 20 72 65 63 6f 72 64 73 20 69 66 20 65  int records if e
8640: 49 6e 74 20 69 73 0a 2a 2a 20 66 61 6c 73 65 2e  Int is.** false.
8650: 20 20 61 5b 5d 20 69 73 20 74 68 65 20 66 6f 75    a[] is the fou
8660: 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6f  r bytes of the o
8670: 6e 2d 64 69 73 6b 20 72 65 63 6f 72 64 20 74 6f  n-disk record to
8680: 20 62 65 20 64 65 63 6f 64 65 64 2e 0a 2a 2a 20   be decoded..** 
8690: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
86a0: 73 20 69 6e 20 22 72 22 2e 0a 2a 2a 0a 2a 2a 20  s in "r"..**.** 
86b0: 54 68 65 72 65 20 61 72 65 20 66 69 76 65 20 76  There are five v
86c0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
86d0: 6d 61 63 72 6f 2e 20 20 54 68 65 20 6c 61 73 74  macro.  The last
86e0: 20 6f 6e 65 20 69 73 20 67 65 6e 65 72 69 63 2e   one is generic.
86f0: 20 20 54 68 65 0a 2a 2a 20 6f 74 68 65 72 20 66    The.** other f
8700: 6f 75 72 20 61 72 65 20 76 61 72 69 6f 75 73 20  our are various 
8710: 61 72 63 68 69 74 65 63 74 75 72 65 73 2d 73 70  architectures-sp
8720: 65 63 69 66 69 63 20 6f 70 74 69 6d 69 7a 61 74  ecific optimizat
8730: 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ions..*/.#if SQL
8740: 49 54 45 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  ITE_BYTEORDER==1
8750: 32 33 34 20 26 26 20 4d 53 56 43 5f 56 45 52 53  234 && MSVC_VERS
8760: 49 4f 4e 3e 3d 31 33 30 30 0a 23 64 65 66 69 6e  ION>=1300.#defin
8770: 65 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43  e RTREE_DECODE_C
8780: 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20 72 29  OORD(eInt, a, r)
8790: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
87a0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
87b0: 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20 20  RtreeCoord c;   
87c0: 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20 64   /* Coordinate d
87d0: 65 63 6f 64 65 64 20 2a 2f 20 20 20 20 20 20 20  ecoded */       
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
87f0: 20 20 63 2e 75 20 3d 20 5f 62 79 74 65 73 77 61    c.u = _byteswa
8800: 70 5f 75 6c 6f 6e 67 28 2a 28 75 33 32 2a 29 61  p_ulong(*(u32*)a
8810: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8830: 20 20 20 20 72 20 3d 20 65 49 6e 74 20 3f 20 28      r = eInt ? (
8840: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62  sqlite3_rtree_db
8850: 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69 74 65 33  l)c.i : (sqlite3
8860: 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 66 3b 20  _rtree_dbl)c.f; 
8870: 5c 0a 7d 0a 23 65 6c 69 66 20 53 51 4c 49 54 45  \.}.#elif SQLITE
8880: 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34  _BYTEORDER==1234
8890: 20 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e 3e   && GCC_VERSION>
88a0: 3d 34 30 30 33 30 30 30 0a 23 64 65 66 69 6e 65  =4003000.#define
88b0: 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f   RTREE_DECODE_CO
88c0: 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20 72 29 20  ORD(eInt, a, r) 
88d0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
88e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 52           \.    R
88f0: 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20 20 20  treeCoord c;    
8900: 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20 64 65  /* Coordinate de
8910: 63 6f 64 65 64 20 2a 2f 20 20 20 20 20 20 20 20  coded */        
8920: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8930: 20 63 2e 75 20 3d 20 5f 5f 62 75 69 6c 74 69 6e   c.u = __builtin
8940: 5f 62 73 77 61 70 33 32 28 2a 28 75 33 32 2a 29  _bswap32(*(u32*)
8950: 61 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  a);             
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8970: 20 20 20 72 20 3d 20 65 49 6e 74 20 3f 20 28 73     r = eInt ? (s
8980: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62 6c  qlite3_rtree_dbl
8990: 29 63 2e 69 20 3a 20 28 73 71 6c 69 74 65 33 5f  )c.i : (sqlite3_
89a0: 72 74 72 65 65 5f 64 62 6c 29 63 2e 66 3b 20 5c  rtree_dbl)c.f; \
89b0: 0a 7d 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  .}.#elif SQLITE_
89c0: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a  BYTEORDER==1234.
89d0: 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45  #define RTREE_DE
89e0: 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74 2c  CODE_COORD(eInt,
89f0: 20 61 2c 20 72 29 20 7b 20 20 20 20 20 20 20 20   a, r) {        
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 5c 0a 20 20 20 20 52 74 72 65 65 43 6f 6f 72 64  \.    RtreeCoord
8a20: 20 63 3b 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69   c;    /* Coordi
8a30: 6e 61 74 65 20 64 65 63 6f 64 65 64 20 2a 2f 20  nate decoded */ 
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 5c 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    \.    memcpy(&
8a60: 63 2e 75 2c 61 2c 34 29 3b 20 20 20 20 20 20 20  c.u,a,4);       
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 5c 0a 20 20 20 20 63 2e 75 20 3d 20      \.    c.u = 
8aa0: 28 28 63 2e 75 3e 3e 32 34 29 26 30 78 66 66 29  ((c.u>>24)&0xff)
8ab0: 7c 28 28 63 2e 75 3e 3e 38 29 26 30 78 66 66 30  |((c.u>>8)&0xff0
8ac0: 30 29 7c 20 20 20 20 20 20 20 20 20 20 20 20 20  0)|             
8ad0: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
8ae0: 20 20 28 28 63 2e 75 26 30 78 66 66 29 3c 3c 32    ((c.u&0xff)<<2
8af0: 34 29 7c 28 28 63 2e 75 26 30 78 66 66 30 30 29  4)|((c.u&0xff00)
8b00: 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20 20 20  <<8);           
8b10: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 72 20          \.    r 
8b20: 3d 20 65 49 6e 74 20 3f 20 28 73 71 6c 69 74 65  = eInt ? (sqlite
8b30: 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 69 20  3_rtree_dbl)c.i 
8b40: 3a 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  : (sqlite3_rtree
8b50: 5f 64 62 6c 29 63 2e 66 3b 20 5c 0a 7d 0a 23 65  _dbl)c.f; \.}.#e
8b60: 6c 69 66 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  lif SQLITE_BYTEO
8b70: 52 44 45 52 3d 3d 34 33 32 31 0a 23 64 65 66 69  RDER==4321.#defi
8b80: 6e 65 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f  ne RTREE_DECODE_
8b90: 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20 72  COORD(eInt, a, r
8ba0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
8bb0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8bc0: 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20   RtreeCoord c;  
8bd0: 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20    /* Coordinate 
8be0: 64 65 63 6f 64 65 64 20 2a 2f 20 20 20 20 20 20  decoded */      
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8c00: 20 20 20 6d 65 6d 63 70 79 28 26 63 2e 75 2c 61     memcpy(&c.u,a
8c10: 2c 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ,4);            
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8c40: 0a 20 20 20 20 72 20 3d 20 65 49 6e 74 20 3f 20  .    r = eInt ? 
8c50: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64  (sqlite3_rtree_d
8c60: 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69 74 65  bl)c.i : (sqlite
8c70: 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e 66 3b  3_rtree_dbl)c.f;
8c80: 20 5c 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   \.}.#else.#defi
8c90: 6e 65 20 52 54 52 45 45 5f 44 45 43 4f 44 45 5f  ne RTREE_DECODE_
8ca0: 43 4f 4f 52 44 28 65 49 6e 74 2c 20 61 2c 20 72  COORD(eInt, a, r
8cb0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
8cc0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8cd0: 20 52 74 72 65 65 43 6f 6f 72 64 20 63 3b 20 20   RtreeCoord c;  
8ce0: 20 20 2f 2a 20 43 6f 6f 72 64 69 6e 61 74 65 20    /* Coordinate 
8cf0: 64 65 63 6f 64 65 64 20 2a 2f 20 20 20 20 20 20  decoded */      
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8d10: 20 20 20 63 2e 75 20 3d 20 28 28 75 33 32 29 61     c.u = ((u32)a
8d20: 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 28 75 33 32  [0]<<24) + ((u32
8d30: 29 61 5b 31 5d 3c 3c 31 36 29 20 20 20 20 20 20  )a[1]<<16)      
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8d50: 0a 20 20 20 20 20 20 20 20 20 20 20 2b 28 28 75  .           +((u
8d60: 33 32 29 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b  32)a[2]<<8) + a[
8d70: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 5c 0a 20 20 20 20 72 20 3d 20 65 49 6e 74 20   \.    r = eInt 
8da0: 3f 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  ? (sqlite3_rtree
8db0: 5f 64 62 6c 29 63 2e 69 20 3a 20 28 73 71 6c 69  _dbl)c.i : (sqli
8dc0: 74 65 33 5f 72 74 72 65 65 5f 64 62 6c 29 63 2e  te3_rtree_dbl)c.
8dd0: 66 3b 20 5c 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  f; \.}.#endif../
8de0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 52  *.** Check the R
8df0: 54 72 65 65 20 6e 6f 64 65 20 6f 72 20 65 6e 74  Tree node or ent
8e00: 72 79 20 67 69 76 65 6e 20 62 79 20 70 43 65 6c  ry given by pCel
8e10: 6c 44 61 74 61 20 61 6e 64 20 70 20 61 67 61 69  lData and p agai
8e20: 6e 73 74 20 74 68 65 20 4d 41 54 43 48 0a 2a 2a  nst the MATCH.**
8e30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 43 6f 6e   constraint pCon
8e40: 73 74 72 61 69 6e 74 2e 20 20 0a 2a 2f 0a 73 74  straint.  .*/.st
8e50: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43 61  atic int rtreeCa
8e60: 6c 6c 62 61 63 6b 43 6f 6e 73 74 72 61 69 6e 74  llbackConstraint
8e70: 28 0a 20 20 52 74 72 65 65 43 6f 6e 73 74 72 61  (.  RtreeConstra
8e80: 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
8e90: 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6e 73 74 72  ,  /* The constr
8ea0: 61 69 6e 74 20 74 6f 20 74 65 73 74 20 2a 2f 0a  aint to test */.
8eb0: 20 20 69 6e 74 20 65 49 6e 74 2c 20 20 20 20 20    int eInt,     
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 2f 2a 20 54 72 75 65 20 69 66 20 52 54 72 65   /* True if RTre
8ee0: 65 20 68 6f 6c 64 69 6e 67 20 69 6e 74 65 67 65  e holding intege
8ef0: 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f  r coordinates */
8f00: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 44 61 74 61  .  u8 *pCellData
8f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8f20: 20 20 2f 2a 20 52 61 77 20 63 65 6c 6c 20 63 6f    /* Raw cell co
8f30: 6e 74 65 6e 74 20 2a 2f 0a 20 20 52 74 72 65 65  ntent */.  Rtree
8f40: 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 53 65  SearchPoint *pSe
8f50: 61 72 63 68 2c 20 20 20 20 20 2f 2a 20 43 6f 6e  arch,     /* Con
8f60: 74 61 69 6e 65 72 20 6f 66 20 74 68 69 73 20 63  tainer of this c
8f70: 65 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ell */.  sqlite3
8f80: 5f 72 74 72 65 65 5f 64 62 6c 20 2a 70 72 53 63  _rtree_dbl *prSc
8f90: 6f 72 65 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20  ore,    /* OUT: 
8fa0: 73 63 6f 72 65 20 66 6f 72 20 74 68 65 20 63 65  score for the ce
8fb0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 65 57  ll */.  int *peW
8fc0: 69 74 68 69 6e 20 20 20 20 20 20 20 20 20 20 20  ithin           
8fd0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 76         /* OUT: v
8fe0: 69 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  isibility of the
8ff0: 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 73 71   cell */.){.  sq
9000: 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65 72  lite3_rtree_quer
9010: 79 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  y_info *pInfo = 
9020: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70 49 6e  pConstraint->pIn
9030: 66 6f 3b 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  fo; /* Callback 
9040: 69 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  info */.  int nC
9050: 6f 6f 72 64 20 3d 20 70 49 6e 66 6f 2d 3e 6e 43  oord = pInfo->nC
9060: 6f 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  oord;           
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 2f 2a 20 4e 6f 2e 20 6f 66 20 63 6f 6f 72 64 69  /* No. of coordi
9090: 6e 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  nates */.  int r
90a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90d0: 2a 20 43 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  * Callback retur
90e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52 74 72 65  n code */.  Rtre
90f0: 65 43 6f 6f 72 64 20 63 3b 20 20 20 20 20 20 20  eCoord c;       
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 2f 2a 20 54 72 61 6e 73 6c 61 74 6f 72 20 75 6e  /* Translator un
9130: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
9140: 5f 72 74 72 65 65 5f 64 62 6c 20 61 43 6f 6f 72  _rtree_dbl aCoor
9150: 64 5b 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45  d[RTREE_MAX_DIME
9160: 4e 53 49 4f 4e 53 2a 32 5d 3b 20 20 20 2f 2a 20  NSIONS*2];   /* 
9170: 44 65 63 6f 64 65 64 20 63 6f 6f 72 64 69 6e 61  Decoded coordina
9180: 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
9190: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
91a0: 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 7c  p==RTREE_MATCH |
91b0: 7c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  | pConstraint->o
91c0: 70 3d 3d 52 54 52 45 45 5f 51 55 45 52 59 20 29  p==RTREE_QUERY )
91d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6f  ;.  assert( nCoo
91e0: 72 64 3d 3d 32 20 7c 7c 20 6e 43 6f 6f 72 64 3d  rd==2 || nCoord=
91f0: 3d 34 20 7c 7c 20 6e 43 6f 6f 72 64 3d 3d 36 20  =4 || nCoord==6 
9200: 7c 7c 20 6e 43 6f 6f 72 64 3d 3d 38 20 7c 7c 20  || nCoord==8 || 
9210: 6e 43 6f 6f 72 64 3d 3d 31 30 20 29 3b 0a 0a 20  nCoord==10 );.. 
9220: 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
9230: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 51 55 45 52  ->op==RTREE_QUER
9240: 59 20 26 26 20 70 53 65 61 72 63 68 2d 3e 69 4c  Y && pSearch->iL
9250: 65 76 65 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 70  evel==1 ){.    p
9260: 49 6e 66 6f 2d 3e 69 52 6f 77 69 64 20 3d 20 72  Info->iRowid = r
9270: 65 61 64 49 6e 74 36 34 28 70 43 65 6c 6c 44 61  eadInt64(pCellDa
9280: 74 61 29 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c  ta);.  }.  pCell
9290: 44 61 74 61 20 2b 3d 20 38 3b 0a 23 69 66 6e 64  Data += 8;.#ifnd
92a0: 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
92b0: 49 4e 54 5f 4f 4e 4c 59 0a 20 20 69 66 28 20 65  INT_ONLY.  if( e
92c0: 49 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 77  Int==0 ){.    sw
92d0: 69 74 63 68 28 20 6e 43 6f 6f 72 64 20 29 7b 0a  itch( nCoord ){.
92e0: 20 20 20 20 20 20 63 61 73 65 20 31 30 3a 20 20        case 10:  
92f0: 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44  readCoord(pCellD
9300: 61 74 61 2b 33 36 2c 20 26 63 29 3b 20 61 43 6f  ata+36, &c); aCo
9310: 6f 72 64 5b 39 5d 20 3d 20 63 2e 66 3b 0a 20 20  ord[9] = c.f;.  
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
9330: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
9340: 61 2b 33 32 2c 20 26 63 29 3b 20 61 43 6f 6f 72  a+32, &c); aCoor
9350: 64 5b 38 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20  d[8] = c.f;.    
9360: 20 20 63 61 73 65 20 38 3a 20 20 20 72 65 61 64    case 8:   read
9370: 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b  Coord(pCellData+
9380: 32 38 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b  28, &c); aCoord[
9390: 37 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20  7] = c.f;.      
93a0: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f            readCo
93b0: 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 32 34  ord(pCellData+24
93c0: 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 36 5d  , &c); aCoord[6]
93d0: 20 3d 20 63 2e 66 3b 0a 20 20 20 20 20 20 63 61   = c.f;.      ca
93e0: 73 65 20 36 3a 20 20 20 72 65 61 64 43 6f 6f 72  se 6:   readCoor
93f0: 64 28 70 43 65 6c 6c 44 61 74 61 2b 32 30 2c 20  d(pCellData+20, 
9400: 26 63 29 3b 20 61 43 6f 6f 72 64 5b 35 5d 20 3d  &c); aCoord[5] =
9410: 20 63 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20   c.f;.          
9420: 20 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28        readCoord(
9430: 70 43 65 6c 6c 44 61 74 61 2b 31 36 2c 20 26 63  pCellData+16, &c
9440: 29 3b 20 61 43 6f 6f 72 64 5b 34 5d 20 3d 20 63  ); aCoord[4] = c
9450: 2e 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20 34  .f;.      case 4
9460: 3a 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43  :   readCoord(pC
9470: 65 6c 6c 44 61 74 61 2b 31 32 2c 20 26 63 29 3b  ellData+12, &c);
9480: 20 61 43 6f 6f 72 64 5b 33 5d 20 3d 20 63 2e 66   aCoord[3] = c.f
9490: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
94a0: 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c    readCoord(pCel
94b0: 6c 44 61 74 61 2b 38 2c 20 20 26 63 29 3b 20 61  lData+8,  &c); a
94c0: 43 6f 6f 72 64 5b 32 5d 20 3d 20 63 2e 66 3b 0a  Coord[2] = c.f;.
94d0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
94e0: 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44  readCoord(pCellD
94f0: 61 74 61 2b 34 2c 20 20 26 63 29 3b 20 61 43 6f  ata+4,  &c); aCo
9500: 6f 72 64 5b 31 5d 20 3d 20 63 2e 66 3b 0a 20 20  ord[1] = c.f;.  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
9520: 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74  adCoord(pCellDat
9530: 61 2c 20 20 20 20 26 63 29 3b 20 61 43 6f 6f 72  a,    &c); aCoor
9540: 64 5b 30 5d 20 3d 20 63 2e 66 3b 0a 20 20 20 20  d[0] = c.f;.    
9550: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
9560: 0a 20 20 7b 0a 20 20 20 20 73 77 69 74 63 68 28  .  {.    switch(
9570: 20 6e 43 6f 6f 72 64 20 29 7b 0a 20 20 20 20 20   nCoord ){.     
9580: 20 63 61 73 65 20 31 30 3a 20 20 72 65 61 64 43   case 10:  readC
9590: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 33  oord(pCellData+3
95a0: 36 2c 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 39  6, &c); aCoord[9
95b0: 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 20  ] = c.i;.       
95c0: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
95d0: 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 33 32 2c  rd(pCellData+32,
95e0: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 38 5d 20   &c); aCoord[8] 
95f0: 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 63 61 73  = c.i;.      cas
9600: 65 20 38 3a 20 20 20 72 65 61 64 43 6f 6f 72 64  e 8:   readCoord
9610: 28 70 43 65 6c 6c 44 61 74 61 2b 32 38 2c 20 26  (pCellData+28, &
9620: 63 29 3b 20 61 43 6f 6f 72 64 5b 37 5d 20 3d 20  c); aCoord[7] = 
9630: 63 2e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  c.i;.           
9640: 20 20 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70       readCoord(p
9650: 43 65 6c 6c 44 61 74 61 2b 32 34 2c 20 26 63 29  CellData+24, &c)
9660: 3b 20 61 43 6f 6f 72 64 5b 36 5d 20 3d 20 63 2e  ; aCoord[6] = c.
9670: 69 3b 0a 20 20 20 20 20 20 63 61 73 65 20 36 3a  i;.      case 6:
9680: 20 20 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65     readCoord(pCe
9690: 6c 6c 44 61 74 61 2b 32 30 2c 20 26 63 29 3b 20  llData+20, &c); 
96a0: 61 43 6f 6f 72 64 5b 35 5d 20 3d 20 63 2e 69 3b  aCoord[5] = c.i;
96b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
96c0: 20 72 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c   readCoord(pCell
96d0: 44 61 74 61 2b 31 36 2c 20 26 63 29 3b 20 61 43  Data+16, &c); aC
96e0: 6f 6f 72 64 5b 34 5d 20 3d 20 63 2e 69 3b 0a 20  oord[4] = c.i;. 
96f0: 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 20 72       case 4:   r
9700: 65 61 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61  eadCoord(pCellDa
9710: 74 61 2b 31 32 2c 20 26 63 29 3b 20 61 43 6f 6f  ta+12, &c); aCoo
9720: 72 64 5b 33 5d 20 3d 20 63 2e 69 3b 0a 20 20 20  rd[3] = c.i;.   
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
9740: 64 43 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61  dCoord(pCellData
9750: 2b 38 2c 20 20 26 63 29 3b 20 61 43 6f 6f 72 64  +8,  &c); aCoord
9760: 5b 32 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20  [2] = c.i;.     
9770: 20 64 65 66 61 75 6c 74 3a 20 20 72 65 61 64 43   default:  readC
9780: 6f 6f 72 64 28 70 43 65 6c 6c 44 61 74 61 2b 34  oord(pCellData+4
9790: 2c 20 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 31  ,  &c); aCoord[1
97a0: 5d 20 3d 20 63 2e 69 3b 0a 20 20 20 20 20 20 20  ] = c.i;.       
97b0: 20 20 20 20 20 20 20 20 20 72 65 61 64 43 6f 6f           readCoo
97c0: 72 64 28 70 43 65 6c 6c 44 61 74 61 2c 20 20 20  rd(pCellData,   
97d0: 20 26 63 29 3b 20 61 43 6f 6f 72 64 5b 30 5d 20   &c); aCoord[0] 
97e0: 3d 20 63 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  = c.i;.    }.  }
97f0: 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69  .  if( pConstrai
9800: 6e 74 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41  nt->op==RTREE_MA
9810: 54 43 48 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  TCH ){.    int e
9820: 57 69 74 68 69 6e 20 3d 20 30 3b 0a 20 20 20 20  Within = 0;.    
9830: 72 63 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74  rc = pConstraint
9840: 2d 3e 75 2e 78 47 65 6f 6d 28 28 73 71 6c 69 74  ->u.xGeom((sqlit
9850: 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
9860: 79 2a 29 70 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y*)pInfo,.      
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 20 20 6e 43 6f 6f 72 64 2c 20          nCoord, 
9890: 61 43 6f 6f 72 64 2c 20 26 65 57 69 74 68 69 6e  aCoord, &eWithin
98a0: 29 3b 0a 20 20 20 20 69 66 28 20 65 57 69 74 68  );.    if( eWith
98b0: 69 6e 3d 3d 30 20 29 20 2a 70 65 57 69 74 68 69  in==0 ) *peWithi
98c0: 6e 20 3d 20 4e 4f 54 5f 57 49 54 48 49 4e 3b 0a  n = NOT_WITHIN;.
98d0: 20 20 20 20 2a 70 72 53 63 6f 72 65 20 3d 20 52      *prScore = R
98e0: 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 7d 65 6c  TREE_ZERO;.  }el
98f0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61  se{.    pInfo->a
9900: 43 6f 6f 72 64 20 3d 20 61 43 6f 6f 72 64 3b 0a  Coord = aCoord;.
9910: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4c 65 76 65      pInfo->iLeve
9920: 6c 20 3d 20 70 53 65 61 72 63 68 2d 3e 69 4c 65  l = pSearch->iLe
9930: 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 70 49 6e  vel - 1;.    pIn
9940: 66 6f 2d 3e 72 53 63 6f 72 65 20 3d 20 70 49 6e  fo->rScore = pIn
9950: 66 6f 2d 3e 72 50 61 72 65 6e 74 53 63 6f 72 65  fo->rParentScore
9960: 20 3d 20 70 53 65 61 72 63 68 2d 3e 72 53 63 6f   = pSearch->rSco
9970: 72 65 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  re;.    pInfo->e
9980: 57 69 74 68 69 6e 20 3d 20 70 49 6e 66 6f 2d 3e  Within = pInfo->
9990: 65 50 61 72 65 6e 74 57 69 74 68 69 6e 20 3d 20  eParentWithin = 
99a0: 70 53 65 61 72 63 68 2d 3e 65 57 69 74 68 69 6e  pSearch->eWithin
99b0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6e 73  ;.    rc = pCons
99c0: 74 72 61 69 6e 74 2d 3e 75 2e 78 51 75 65 72 79  traint->u.xQuery
99d0: 46 75 6e 63 28 70 49 6e 66 6f 29 3b 0a 20 20 20  Func(pInfo);.   
99e0: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 65 57 69 74   if( pInfo->eWit
99f0: 68 69 6e 3c 2a 70 65 57 69 74 68 69 6e 20 29 20  hin<*peWithin ) 
9a00: 2a 70 65 57 69 74 68 69 6e 20 3d 20 70 49 6e 66  *peWithin = pInf
9a10: 6f 2d 3e 65 57 69 74 68 69 6e 3b 0a 20 20 20 20  o->eWithin;.    
9a20: 69 66 28 20 70 49 6e 66 6f 2d 3e 72 53 63 6f 72  if( pInfo->rScor
9a30: 65 3c 2a 70 72 53 63 6f 72 65 20 7c 7c 20 2a 70  e<*prScore || *p
9a40: 72 53 63 6f 72 65 3c 52 54 52 45 45 5f 5a 45 52  rScore<RTREE_ZER
9a50: 4f 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 53 63  O ){.      *prSc
9a60: 6f 72 65 20 3d 20 70 49 6e 66 6f 2d 3e 72 53 63  ore = pInfo->rSc
9a70: 6f 72 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ore;.    }.  }. 
9a80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9a90: 2a 20 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  * .** Check the 
9aa0: 69 6e 74 65 72 6e 61 6c 20 52 54 72 65 65 20 6e  internal RTree n
9ab0: 6f 64 65 20 67 69 76 65 6e 20 62 79 20 70 43 65  ode given by pCe
9ac0: 6c 6c 44 61 74 61 20 61 67 61 69 6e 73 74 20 63  llData against c
9ad0: 6f 6e 73 74 72 61 69 6e 74 20 70 2e 0a 2a 2a 20  onstraint p..** 
9ae0: 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  If this constrai
9af0: 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74  nt cannot be sat
9b00: 69 73 66 69 65 64 20 62 79 20 61 6e 79 20 63 68  isfied by any ch
9b10: 69 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 6e  ild within the n
9b20: 6f 64 65 2c 0a 2a 2a 20 73 65 74 20 2a 70 65 57  ode,.** set *peW
9b30: 69 74 68 69 6e 20 74 6f 20 4e 4f 54 5f 57 49 54  ithin to NOT_WIT
9b40: 48 49 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  HIN..*/.static v
9b50: 6f 69 64 20 72 74 72 65 65 4e 6f 6e 6c 65 61 66  oid rtreeNonleaf
9b60: 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 52 74  Constraint(.  Rt
9b70: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  reeConstraint *p
9b80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
9b90: 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 65  constraint to te
9ba0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 49 6e 74  st */.  int eInt
9bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9bc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 54     /* True if RT
9bd0: 72 65 65 20 68 6f 6c 64 73 20 69 6e 74 65 67 65  ree holds intege
9be0: 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f  r coordinates */
9bf0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 44 61 74 61  .  u8 *pCellData
9c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9c10: 20 52 61 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   Raw cell conten
9c20: 74 20 61 73 20 61 70 70 65 61 72 73 20 6f 6e 20  t as appears on 
9c30: 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  disk */.  int *p
9c40: 65 57 69 74 68 69 6e 20 20 20 20 20 20 20 20 20  eWithin         
9c50: 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 64       /* Adjust d
9c60: 6f 77 6e 77 61 72 64 2c 20 61 73 20 61 70 70 72  ownward, as appr
9c70: 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
9c80: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 64 62  sqlite3_rtree_db
9c90: 6c 20 76 61 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  l val;     /* Co
9ca0: 6f 72 64 69 6e 61 74 65 20 76 61 6c 75 65 20 63  ordinate value c
9cb0: 6f 6e 76 65 72 74 20 74 6f 20 61 20 64 6f 75 62  onvert to a doub
9cc0: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70 2d 3e 69  le */..  /* p->i
9cd0: 43 6f 6f 72 64 20 6d 69 67 68 74 20 70 6f 69 6e  Coord might poin
9ce0: 74 20 74 6f 20 65 69 74 68 65 72 20 61 20 6c 6f  t to either a lo
9cf0: 77 65 72 20 6f 72 20 75 70 70 65 72 20 62 6f 75  wer or upper bou
9d00: 6e 64 20 63 6f 6f 72 64 69 6e 61 74 65 0a 20 20  nd coordinate.  
9d10: 2a 2a 20 69 6e 20 61 20 63 6f 6f 72 64 69 6e 61  ** in a coordina
9d20: 74 65 20 70 61 69 72 2e 20 20 42 75 74 20 6d 61  te pair.  But ma
9d30: 6b 65 20 70 43 65 6c 6c 44 61 74 61 20 70 6f 69  ke pCellData poi
9d40: 6e 74 20 74 6f 20 74 68 65 20 6c 6f 77 65 72 20  nt to the lower 
9d50: 62 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 70 43  bound..  */.  pC
9d60: 65 6c 6c 44 61 74 61 20 2b 3d 20 38 20 2b 20 34  ellData += 8 + 4
9d70: 2a 28 70 2d 3e 69 43 6f 6f 72 64 26 30 78 66 65  *(p->iCoord&0xfe
9d80: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 2d 3e  );..  assert(p->
9d90: 6f 70 3d 3d 52 54 52 45 45 5f 4c 45 20 7c 7c 20  op==RTREE_LE || 
9da0: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 54 20  p->op==RTREE_LT 
9db0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
9dc0: 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e  GE .      || p->
9dd0: 6f 70 3d 3d 52 54 52 45 45 5f 47 54 20 7c 7c 20  op==RTREE_GT || 
9de0: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 45 51 20  p->op==RTREE_EQ 
9df0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 28  );.  assert( (((
9e00: 28 63 68 61 72 2a 29 70 43 65 6c 6c 44 61 74 61  (char*)pCellData
9e10: 29 20 2d 20 28 63 68 61 72 2a 29 30 29 26 33 29  ) - (char*)0)&3)
9e20: 3d 3d 30 20 29 3b 20 20 2f 2a 20 34 2d 62 79 74  ==0 );  /* 4-byt
9e30: 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 73  e aligned */.  s
9e40: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
9e50: 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 4c      case RTREE_L
9e60: 45 3a 0a 20 20 20 20 63 61 73 65 20 52 54 52 45  E:.    case RTRE
9e70: 45 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 52  E_LT:.    case R
9e80: 54 52 45 45 5f 45 51 3a 0a 20 20 20 20 20 20 52  TREE_EQ:.      R
9e90: 54 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f 52  TREE_DECODE_COOR
9ea0: 44 28 65 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74  D(eInt, pCellDat
9eb0: 61 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 2f  a, val);.      /
9ec0: 2a 20 76 61 6c 20 6e 6f 77 20 68 6f 6c 64 73 20  * val now holds 
9ed0: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
9ee0: 6f 66 20 74 68 65 20 63 6f 6f 72 64 69 6e 61 74  of the coordinat
9ef0: 65 20 70 61 69 72 20 2a 2f 0a 20 20 20 20 20 20  e pair */.      
9f00: 69 66 28 20 70 2d 3e 75 2e 72 56 61 6c 75 65 3e  if( p->u.rValue>
9f10: 3d 76 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  =val ) return;. 
9f20: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
9f30: 52 54 52 45 45 5f 45 51 20 29 20 62 72 65 61 6b  RTREE_EQ ) break
9f40: 3b 20 20 2f 2a 20 52 54 52 45 45 5f 4c 45 20 61  ;  /* RTREE_LE a
9f50: 6e 64 20 52 54 52 45 45 5f 4c 54 20 65 6e 64 20  nd RTREE_LT end 
9f60: 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  here */.      /*
9f70: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 66 6f   Fall through fo
9f80: 72 20 74 68 65 20 52 54 52 45 45 5f 45 51 20 63  r the RTREE_EQ c
9f90: 61 73 65 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61  ase */..    defa
9fa0: 75 6c 74 3a 20 2f 2a 20 52 54 52 45 45 5f 47 54  ult: /* RTREE_GT
9fb0: 20 6f 72 20 52 54 52 45 45 5f 47 45 2c 20 20 6f   or RTREE_GE,  o
9fc0: 72 20 66 61 6c 6c 74 68 72 6f 75 67 68 20 6f 66  r fallthrough of
9fd0: 20 52 54 52 45 45 5f 45 51 20 2a 2f 0a 20 20 20   RTREE_EQ */.   
9fe0: 20 20 20 70 43 65 6c 6c 44 61 74 61 20 2b 3d 20     pCellData += 
9ff0: 34 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 44  4;.      RTREE_D
a000: 45 43 4f 44 45 5f 43 4f 4f 52 44 28 65 49 6e 74  ECODE_COORD(eInt
a010: 2c 20 70 43 65 6c 6c 44 61 74 61 2c 20 76 61 6c  , pCellData, val
a020: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 76 61 6c 20  );.      /* val 
a030: 6e 6f 77 20 68 6f 6c 64 73 20 74 68 65 20 75 70  now holds the up
a040: 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
a050: 20 63 6f 6f 72 64 69 6e 61 74 65 20 70 61 69 72   coordinate pair
a060: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
a070: 3e 75 2e 72 56 61 6c 75 65 3c 3d 76 61 6c 20 29  >u.rValue<=val )
a080: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a   return;.  }.  *
a090: 70 65 57 69 74 68 69 6e 20 3d 20 4e 4f 54 5f 57  peWithin = NOT_W
a0a0: 49 54 48 49 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITHIN;.}../*.** 
a0b0: 43 68 65 63 6b 20 74 68 65 20 6c 65 61 66 20 52  Check the leaf R
a0c0: 54 72 65 65 20 63 65 6c 6c 20 67 69 76 65 6e 20  Tree cell given 
a0d0: 62 79 20 70 43 65 6c 6c 44 61 74 61 20 61 67 61  by pCellData aga
a0e0: 69 6e 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  inst constraint 
a0f0: 70 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f  p..** If this co
a100: 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
a110: 73 61 74 69 73 66 69 65 64 2c 20 73 65 74 20 2a  satisfied, set *
a120: 70 65 57 69 74 68 69 6e 20 74 6f 20 4e 4f 54 5f  peWithin to NOT_
a130: 57 49 54 48 49 4e 2e 0a 2a 2a 20 49 66 20 74 68  WITHIN..** If th
a140: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
a150: 73 61 74 69 73 66 69 65 64 2c 20 6c 65 61 76 65  satisfied, leave
a160: 20 2a 70 65 57 69 74 68 69 6e 20 75 6e 63 68 61   *peWithin uncha
a170: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nged..**.** The 
a180: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66  constraint is of
a190: 20 74 68 65 20 66 6f 72 6d 3a 20 20 78 4e 20 6f   the form:  xN o
a1a0: 70 20 24 76 61 6c 0a 2a 2a 0a 2a 2a 20 54 68 65  p $val.**.** The
a1b0: 20 6f 70 20 69 73 20 67 69 76 65 6e 20 62 79 20   op is given by 
a1c0: 70 2d 3e 6f 70 2e 20 20 54 68 65 20 78 4e 20 69  p->op.  The xN i
a1d0: 73 20 70 2d 3e 69 43 6f 6f 72 64 2d 74 68 20 63  s p->iCoord-th c
a1e0: 6f 6f 72 64 69 6e 61 74 65 20 69 6e 0a 2a 2a 20  oordinate in.** 
a1f0: 70 43 65 6c 6c 44 61 74 61 2e 20 20 24 76 61 6c  pCellData.  $val
a200: 20 69 73 20 67 69 76 65 6e 20 62 79 20 70 2d 3e   is given by p->
a210: 75 2e 72 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  u.rValue..*/.sta
a220: 74 69 63 20 76 6f 69 64 20 72 74 72 65 65 4c 65  tic void rtreeLe
a230: 61 66 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  afConstraint(.  
a240: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20  RtreeConstraint 
a250: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
a260: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  e constraint to 
a270: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 49  test */.  int eI
a280: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
a290: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a2a0: 52 54 72 65 65 20 68 6f 6c 64 73 20 69 6e 74 65  RTree holds inte
a2b0: 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 20  ger coordinates 
a2c0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 44 61  */.  u8 *pCellDa
a2d0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
a2e0: 2f 2a 20 52 61 77 20 63 65 6c 6c 20 63 6f 6e 74  /* Raw cell cont
a2f0: 65 6e 74 20 61 73 20 61 70 70 65 61 72 73 20 6f  ent as appears o
a300: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20  n disk */.  int 
a310: 2a 70 65 57 69 74 68 69 6e 20 20 20 20 20 20 20  *peWithin       
a320: 20 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74         /* Adjust
a330: 20 64 6f 77 6e 77 61 72 64 2c 20 61 73 20 61 70   downward, as ap
a340: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
a350: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 78 4e    RtreeDValue xN
a360: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6f 72 64 69  ;      /* Coordi
a370: 6e 61 74 65 20 76 61 6c 75 65 20 63 6f 6e 76 65  nate value conve
a380: 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62 6c 65  rted to a double
a390: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 70 2d   */..  assert(p-
a3a0: 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 45 20 7c 7c  >op==RTREE_LE ||
a3b0: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 54   p->op==RTREE_LT
a3c0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45   || p->op==RTREE
a3d0: 5f 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d  _GE .      || p-
a3e0: 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 54 20 7c 7c  >op==RTREE_GT ||
a3f0: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 45 51   p->op==RTREE_EQ
a400: 20 29 3b 0a 20 20 70 43 65 6c 6c 44 61 74 61 20   );.  pCellData 
a410: 2b 3d 20 38 20 2b 20 70 2d 3e 69 43 6f 6f 72 64  += 8 + p->iCoord
a420: 2a 34 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  *4;.  assert( ((
a430: 28 28 63 68 61 72 2a 29 70 43 65 6c 6c 44 61 74  ((char*)pCellDat
a440: 61 29 20 2d 20 28 63 68 61 72 2a 29 30 29 26 33  a) - (char*)0)&3
a450: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 34 2d 62 79  )==0 );  /* 4-by
a460: 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
a470: 52 54 52 45 45 5f 44 45 43 4f 44 45 5f 43 4f 4f  RTREE_DECODE_COO
a480: 52 44 28 65 49 6e 74 2c 20 70 43 65 6c 6c 44 61  RD(eInt, pCellDa
a490: 74 61 2c 20 78 4e 29 3b 0a 20 20 73 77 69 74 63  ta, xN);.  switc
a4a0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
a4b0: 63 61 73 65 20 52 54 52 45 45 5f 4c 45 3a 20 69  case RTREE_LE: i
a4c0: 66 28 20 78 4e 20 3c 3d 20 70 2d 3e 75 2e 72 56  f( xN <= p->u.rV
a4d0: 61 6c 75 65 20 29 20 72 65 74 75 72 6e 3b 20 20  alue ) return;  
a4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a4f0: 52 54 52 45 45 5f 4c 54 3a 20 69 66 28 20 78 4e  RTREE_LT: if( xN
a500: 20 3c 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20   <  p->u.rValue 
a510: 29 20 72 65 74 75 72 6e 3b 20 20 62 72 65 61 6b  ) return;  break
a520: 3b 0a 20 20 20 20 63 61 73 65 20 52 54 52 45 45  ;.    case RTREE
a530: 5f 47 45 3a 20 69 66 28 20 78 4e 20 3e 3d 20 70  _GE: if( xN >= p
a540: 2d 3e 75 2e 72 56 61 6c 75 65 20 29 20 72 65 74  ->u.rValue ) ret
a550: 75 72 6e 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  urn;  break;.   
a560: 20 63 61 73 65 20 52 54 52 45 45 5f 47 54 3a 20   case RTREE_GT: 
a570: 69 66 28 20 78 4e 20 3e 20 20 70 2d 3e 75 2e 72  if( xN >  p->u.r
a580: 56 61 6c 75 65 20 29 20 72 65 74 75 72 6e 3b 20  Value ) return; 
a590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
a5a0: 75 6c 74 3a 20 20 20 20 20 20 20 69 66 28 20 78  ult:       if( x
a5b0: 4e 20 3d 3d 20 70 2d 3e 75 2e 72 56 61 6c 75 65  N == p->u.rValue
a5c0: 20 29 20 72 65 74 75 72 6e 3b 20 20 62 72 65 61   ) return;  brea
a5d0: 6b 3b 0a 20 20 7d 0a 20 20 2a 70 65 57 69 74 68  k;.  }.  *peWith
a5e0: 69 6e 20 3d 20 4e 4f 54 5f 57 49 54 48 49 4e 3b  in = NOT_WITHIN;
a5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 66  .}../*.** One of
a600: 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 6e 6f   the cells in no
a610: 64 65 20 70 4e 6f 64 65 20 69 73 20 67 75 61 72  de pNode is guar
a620: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
a630: 20 36 34 2d 62 69 74 20 0a 2a 2a 20 69 6e 74 65   64-bit .** inte
a640: 67 65 72 20 76 61 6c 75 65 20 65 71 75 61 6c 20  ger value equal 
a650: 74 6f 20 69 52 6f 77 69 64 2e 20 52 65 74 75 72  to iRowid. Retur
a660: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
a670: 68 69 73 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  his cell..*/.sta
a680: 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 6f 77 69  tic int nodeRowi
a690: 64 49 6e 64 65 78 28 0a 20 20 52 74 72 65 65 20  dIndex(.  Rtree 
a6a0: 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65  *pRtree, .  Rtre
a6b0: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20  eNode *pNode, . 
a6c0: 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20 69   i64 iRowid,.  i
a6d0: 6e 74 20 2a 70 69 49 6e 64 65 78 0a 29 7b 0a 20  nt *piIndex.){. 
a6e0: 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e   int ii;.  int n
a6f0: 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
a700: 64 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  de);.  assert( n
a710: 43 65 6c 6c 3c 32 30 30 20 29 3b 0a 20 20 66 6f  Cell<200 );.  fo
a720: 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c  r(ii=0; ii<nCell
a730: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
a740: 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52   nodeGetRowid(pR
a750: 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 69 29  tree, pNode, ii)
a760: 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ==iRowid ){.    
a770: 20 20 2a 70 69 49 6e 64 65 78 20 3d 20 69 69 3b    *piIndex = ii;
a780: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a790: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
a7a0: 20 7d 0a 20 20 52 54 52 45 45 5f 49 53 5f 43 4f   }.  RTREE_IS_CO
a7b0: 52 52 55 50 54 28 70 52 74 72 65 65 29 3b 0a 20  RRUPT(pRtree);. 
a7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a7d0: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 7d 0a 0a  ORRUPT_VTAB;.}..
a7e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
a7f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65   index of the ce
a800: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ll containing a 
a810: 70 6f 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20  pointer to node 
a820: 70 4e 6f 64 65 0a 2a 2a 20 69 6e 20 69 74 73 20  pNode.** in its 
a830: 70 61 72 65 6e 74 2e 20 49 66 20 70 4e 6f 64 65  parent. If pNode
a840: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   is the root nod
a850: 65 2c 20 72 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f  e, return -1..*/
a860: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
a870: 50 61 72 65 6e 74 49 6e 64 65 78 28 52 74 72 65  ParentIndex(Rtre
a880: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
a890: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Node *pNode, int
a8a0: 20 2a 70 69 49 6e 64 65 78 29 7b 0a 20 20 52 74   *piIndex){.  Rt
a8b0: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
a8c0: 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e   = pNode->pParen
a8d0: 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
a8e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   ){.    return n
a8f0: 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52  odeRowidIndex(pR
a900: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  tree, pParent, p
a910: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 70 69 49  Node->iNode, piI
a920: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  ndex);.  }.  *pi
a930: 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 72 65  Index = -1;.  re
a940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a950: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
a960: 20 74 77 6f 20 73 65 61 72 63 68 20 70 6f 69 6e   two search poin
a970: 74 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  ts.  Return nega
a980: 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
a990: 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
a9a0: 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
a9b0: 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
a9c0: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
a9d0: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2a 0a 2a  the second..**.*
a9e0: 2a 20 54 68 65 20 72 53 63 6f 72 65 20 69 73 20  * The rScore is 
a9f0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
aa00: 20 20 53 6d 61 6c 6c 65 72 20 72 53 63 6f 72 65    Smaller rScore
aa10: 20 76 61 6c 75 65 73 20 63 6f 6d 65 20 66 69 72   values come fir
aa20: 73 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 72 53  st..** If the rS
aa30: 63 6f 72 65 20 69 73 20 61 20 74 69 65 2c 20 74  core is a tie, t
aa40: 68 65 6e 20 75 73 65 20 69 4c 65 76 65 6c 20 61  hen use iLevel a
aa50: 73 20 74 68 65 20 74 69 65 20 62 72 65 61 6b 65  s the tie breake
aa60: 72 20 77 69 74 68 20 73 6d 61 6c 6c 65 72 0a 2a  r with smaller.*
aa70: 2a 20 69 4c 65 76 65 6c 20 76 61 6c 75 65 73 20  * iLevel values 
aa80: 63 6f 6d 69 6e 67 20 66 69 72 73 74 2e 20 20 49  coming first.  I
aa90: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 72  n this way, if r
aaa0: 53 63 6f 72 65 20 69 73 20 74 68 65 20 73 61 6d  Score is the sam
aab0: 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 53 65 61  e for all.** Sea
aac0: 72 63 68 50 6f 69 6e 74 73 2c 20 74 68 65 6e 20  rchPoints, then 
aad0: 69 4c 65 76 65 6c 20 62 65 63 6f 6d 65 73 20 74  iLevel becomes t
aae0: 68 65 20 64 65 63 69 64 69 6e 67 20 66 61 63 74  he deciding fact
aaf0: 6f 72 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  or and the resul
ab00: 74 0a 2a 2a 20 69 73 20 61 20 64 65 70 74 68 2d  t.** is a depth-
ab10: 66 69 72 73 74 20 73 65 61 72 63 68 2c 20 77 68  first search, wh
ab20: 69 63 68 20 69 73 20 74 68 65 20 64 65 73 69 72  ich is the desir
ab30: 65 64 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  ed default behav
ab40: 69 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ior..*/.static i
ab50: 6e 74 20 72 74 72 65 65 53 65 61 72 63 68 50 6f  nt rtreeSearchPo
ab60: 69 6e 74 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f  intCompare(.  co
ab70: 6e 73 74 20 52 74 72 65 65 53 65 61 72 63 68 50  nst RtreeSearchP
ab80: 6f 69 6e 74 20 2a 70 41 2c 0a 20 20 63 6f 6e 73  oint *pA,.  cons
ab90: 74 20 52 74 72 65 65 53 65 61 72 63 68 50 6f 69  t RtreeSearchPoi
aba0: 6e 74 20 2a 70 42 0a 29 7b 0a 20 20 69 66 28 20  nt *pB.){.  if( 
abb0: 70 41 2d 3e 72 53 63 6f 72 65 3c 70 42 2d 3e 72  pA->rScore<pB->r
abc0: 53 63 6f 72 65 20 29 20 72 65 74 75 72 6e 20 2d  Score ) return -
abd0: 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 72 53 63  1;.  if( pA->rSc
abe0: 6f 72 65 3e 70 42 2d 3e 72 53 63 6f 72 65 20 29  ore>pB->rScore )
abf0: 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 69 66   return +1;.  if
ac00: 28 20 70 41 2d 3e 69 4c 65 76 65 6c 3c 70 42 2d  ( pA->iLevel<pB-
ac10: 3e 69 4c 65 76 65 6c 20 29 20 72 65 74 75 72 6e  >iLevel ) return
ac20: 20 2d 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69   -1;.  if( pA->i
ac30: 4c 65 76 65 6c 3e 70 42 2d 3e 69 4c 65 76 65 6c  Level>pB->iLevel
ac40: 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
ac50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ac60: 2a 2a 20 49 6e 74 65 72 63 68 61 6e 67 65 20 74  ** Interchange t
ac70: 77 6f 20 73 65 61 72 63 68 20 70 6f 69 6e 74 73  wo search points
ac80: 20 69 6e 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f   in a cursor..*/
ac90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72  .static void rtr
aca0: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 53 77 61  eeSearchPointSwa
acb0: 70 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70  p(RtreeCursor *p
acc0: 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 6a 29 7b  , int i, int j){
acd0: 0a 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f  .  RtreeSearchPo
ace0: 69 6e 74 20 74 20 3d 20 70 2d 3e 61 50 6f 69 6e  int t = p->aPoin
acf0: 74 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  t[i];.  assert( 
ad00: 69 3c 6a 20 29 3b 0a 20 20 70 2d 3e 61 50 6f 69  i<j );.  p->aPoi
ad10: 6e 74 5b 69 5d 20 3d 20 70 2d 3e 61 50 6f 69 6e  nt[i] = p->aPoin
ad20: 74 5b 6a 5d 3b 0a 20 20 70 2d 3e 61 50 6f 69 6e  t[j];.  p->aPoin
ad30: 74 5b 6a 5d 20 3d 20 74 3b 0a 20 20 69 2b 2b 3b  t[j] = t;.  i++;
ad40: 20 6a 2b 2b 3b 0a 20 20 69 66 28 20 69 3c 52 54   j++;.  if( i<RT
ad50: 52 45 45 5f 43 41 43 48 45 5f 53 5a 20 29 7b 0a  REE_CACHE_SZ ){.
ad60: 20 20 20 20 69 66 28 20 6a 3e 3d 52 54 52 45 45      if( j>=RTREE
ad70: 5f 43 41 43 48 45 5f 53 5a 20 29 7b 0a 20 20 20  _CACHE_SZ ){.   
ad80: 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 52     nodeRelease(R
ad90: 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70  TREE_OF_CURSOR(p
ada0: 29 2c 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d 29 3b  ), p->aNode[i]);
adb0: 0a 20 20 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b  .      p->aNode[
adc0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  i] = 0;.    }els
add0: 65 7b 0a 20 20 20 20 20 20 52 74 72 65 65 4e 6f  e{.      RtreeNo
ade0: 64 65 20 2a 70 54 65 6d 70 20 3d 20 70 2d 3e 61  de *pTemp = p->a
adf0: 4e 6f 64 65 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Node[i];.      p
ae00: 2d 3e 61 4e 6f 64 65 5b 69 5d 20 3d 20 70 2d 3e  ->aNode[i] = p->
ae10: 61 4e 6f 64 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  aNode[j];.      
ae20: 70 2d 3e 61 4e 6f 64 65 5b 6a 5d 20 3d 20 70 54  p->aNode[j] = pT
ae30: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  emp;.    }.  }.}
ae40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ae50: 68 65 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20  he search point 
ae60: 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20  with the lowest 
ae70: 63 75 72 72 65 6e 74 20 73 63 6f 72 65 2e 0a 2a  current score..*
ae80: 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65 53 65  /.static RtreeSe
ae90: 61 72 63 68 50 6f 69 6e 74 20 2a 72 74 72 65 65  archPoint *rtree
aea0: 53 65 61 72 63 68 50 6f 69 6e 74 46 69 72 73 74  SearchPointFirst
aeb0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43  (RtreeCursor *pC
aec0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
aed0: 75 72 2d 3e 62 50 6f 69 6e 74 20 3f 20 26 70 43  ur->bPoint ? &pC
aee0: 75 72 2d 3e 73 50 6f 69 6e 74 20 3a 20 70 43 75  ur->sPoint : pCu
aef0: 72 2d 3e 6e 50 6f 69 6e 74 20 3f 20 70 43 75 72  r->nPoint ? pCur
af00: 2d 3e 61 50 6f 69 6e 74 20 3a 20 30 3b 0a 7d 0a  ->aPoint : 0;.}.
af10: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 52  ./*.** Get the R
af20: 74 72 65 65 4e 6f 64 65 20 66 6f 72 20 74 68 65  treeNode for the
af30: 20 73 65 61 72 63 68 20 70 6f 69 6e 74 20 77 69   search point wi
af40: 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  th the lowest sc
af50: 6f 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ore..*/.static R
af60: 74 72 65 65 4e 6f 64 65 20 2a 72 74 72 65 65 4e  treeNode *rtreeN
af70: 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72 63 68  odeOfFirstSearch
af80: 50 6f 69 6e 74 28 52 74 72 65 65 43 75 72 73 6f  Point(RtreeCurso
af90: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
afa0: 43 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  C){.  sqlite3_in
afb0: 74 36 34 20 69 64 3b 0a 20 20 69 6e 74 20 69 69  t64 id;.  int ii
afc0: 20 3d 20 31 20 2d 20 70 43 75 72 2d 3e 62 50 6f   = 1 - pCur->bPo
afd0: 69 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  int;.  assert( i
afe0: 69 3d 3d 30 20 7c 7c 20 69 69 3d 3d 31 20 29 3b  i==0 || ii==1 );
aff0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
b000: 3e 62 50 6f 69 6e 74 20 7c 7c 20 70 43 75 72 2d  >bPoint || pCur-
b010: 3e 6e 50 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28  >nPoint );.  if(
b020: 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 69 5d   pCur->aNode[ii]
b030: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
b040: 74 28 20 70 52 43 21 3d 30 20 29 3b 0a 20 20 20  t( pRC!=0 );.   
b050: 20 69 64 20 3d 20 69 69 20 3f 20 70 43 75 72 2d   id = ii ? pCur-
b060: 3e 61 50 6f 69 6e 74 5b 30 5d 2e 69 64 20 3a 20  >aPoint[0].id : 
b070: 70 43 75 72 2d 3e 73 50 6f 69 6e 74 2e 69 64 3b  pCur->sPoint.id;
b080: 0a 20 20 20 20 2a 70 52 43 20 3d 20 6e 6f 64 65  .    *pRC = node
b090: 41 63 71 75 69 72 65 28 52 54 52 45 45 5f 4f 46  Acquire(RTREE_OF
b0a0: 5f 43 55 52 53 4f 52 28 70 43 75 72 29 2c 20 69  _CURSOR(pCur), i
b0b0: 64 2c 20 30 2c 20 26 70 43 75 72 2d 3e 61 4e 6f  d, 0, &pCur->aNo
b0c0: 64 65 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  de[ii]);.  }.  r
b0d0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 61 4e 6f 64  eturn pCur->aNod
b0e0: 65 5b 69 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e[ii];.}../*.** 
b0f0: 50 75 73 68 20 61 20 6e 65 77 20 65 6c 65 6d 65  Push a new eleme
b100: 6e 74 20 6f 6e 74 6f 20 74 68 65 20 70 72 69 6f  nt onto the prio
b110: 72 69 74 79 20 71 75 65 75 65 0a 2a 2f 0a 73 74  rity queue.*/.st
b120: 61 74 69 63 20 52 74 72 65 65 53 65 61 72 63 68  atic RtreeSearch
b130: 50 6f 69 6e 74 20 2a 72 74 72 65 65 45 6e 71 75  Point *rtreeEnqu
b140: 65 75 65 28 0a 20 20 52 74 72 65 65 43 75 72 73  eue(.  RtreeCurs
b150: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 2f 2a 20  or *pCur,    /* 
b160: 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  The cursor */.  
b170: 52 74 72 65 65 44 56 61 6c 75 65 20 72 53 63 6f  RtreeDValue rSco
b180: 72 65 2c 20 20 20 2f 2a 20 53 63 6f 72 65 20 66  re,   /* Score f
b190: 6f 72 20 74 68 65 20 6e 65 77 20 73 65 61 72 63  or the new searc
b1a0: 68 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  h point */.  u8 
b1b0: 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  iLevel          
b1c0: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f 72 20     /* Level for 
b1d0: 74 68 65 20 6e 65 77 20 73 65 61 72 63 68 20 70  the new search p
b1e0: 6f 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  oint */.){.  int
b1f0: 20 69 2c 20 6a 3b 0a 20 20 52 74 72 65 65 53 65   i, j;.  RtreeSe
b200: 61 72 63 68 50 6f 69 6e 74 20 2a 70 4e 65 77 3b  archPoint *pNew;
b210: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 50 6f  .  if( pCur->nPo
b220: 69 6e 74 3e 3d 70 43 75 72 2d 3e 6e 50 6f 69 6e  int>=pCur->nPoin
b230: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  tAlloc ){.    in
b240: 74 20 6e 4e 65 77 20 3d 20 70 43 75 72 2d 3e 6e  t nNew = pCur->n
b250: 50 6f 69 6e 74 41 6c 6c 6f 63 2a 32 20 2b 20 38  PointAlloc*2 + 8
b260: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
b270: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
b280: 43 75 72 2d 3e 61 50 6f 69 6e 74 2c 20 6e 4e 65  Cur->aPoint, nNe
b290: 77 2a 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61  w*sizeof(pCur->a
b2a0: 50 6f 69 6e 74 5b 30 5d 29 29 3b 0a 20 20 20 20  Point[0]));.    
b2b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b2c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 43 75 72  turn 0;.    pCur
b2d0: 2d 3e 61 50 6f 69 6e 74 20 3d 20 70 4e 65 77 3b  ->aPoint = pNew;
b2e0: 0a 20 20 20 20 70 43 75 72 2d 3e 6e 50 6f 69 6e  .    pCur->nPoin
b2f0: 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  tAlloc = nNew;. 
b300: 20 7d 0a 20 20 69 20 3d 20 70 43 75 72 2d 3e 6e   }.  i = pCur->n
b310: 50 6f 69 6e 74 2b 2b 3b 0a 20 20 70 4e 65 77 20  Point++;.  pNew 
b320: 3d 20 70 43 75 72 2d 3e 61 50 6f 69 6e 74 20 2b  = pCur->aPoint +
b330: 20 69 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 63 6f   i;.  pNew->rSco
b340: 72 65 20 3d 20 72 53 63 6f 72 65 3b 0a 20 20 70  re = rScore;.  p
b350: 4e 65 77 2d 3e 69 4c 65 76 65 6c 20 3d 20 69 4c  New->iLevel = iL
b360: 65 76 65 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  evel;.  assert( 
b370: 69 4c 65 76 65 6c 3c 3d 52 54 52 45 45 5f 4d 41  iLevel<=RTREE_MA
b380: 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 77 68 69  X_DEPTH );.  whi
b390: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 52  le( i>0 ){.    R
b3a0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
b3b0: 2a 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 6a 20  *pParent;.    j 
b3c0: 3d 20 28 69 2d 31 29 2f 32 3b 0a 20 20 20 20 70  = (i-1)/2;.    p
b3d0: 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
b3e0: 50 6f 69 6e 74 20 2b 20 6a 3b 0a 20 20 20 20 69  Point + j;.    i
b3f0: 66 28 20 72 74 72 65 65 53 65 61 72 63 68 50 6f  f( rtreeSearchPo
b400: 69 6e 74 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  intCompare(pNew,
b410: 20 70 50 61 72 65 6e 74 29 3e 3d 30 20 29 20 62   pParent)>=0 ) b
b420: 72 65 61 6b 3b 0a 20 20 20 20 72 74 72 65 65 53  reak;.    rtreeS
b430: 65 61 72 63 68 50 6f 69 6e 74 53 77 61 70 28 70  earchPointSwap(p
b440: 43 75 72 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20  Cur, j, i);.    
b450: 69 20 3d 20 6a 3b 0a 20 20 20 20 70 4e 65 77 20  i = j;.    pNew 
b460: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20  = pParent;.  }. 
b470: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
b480: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
b490: 61 20 6e 65 77 20 52 74 72 65 65 53 65 61 72 63  a new RtreeSearc
b4a0: 68 50 6f 69 6e 74 20 61 6e 64 20 72 65 74 75 72  hPoint and retur
b4b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
b4c0: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4e 55  t.  Return.** NU
b4d0: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  LL if malloc fai
b4e0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  ls..*/.static Rt
b4f0: 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a  reeSearchPoint *
b500: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
b510: 4e 65 77 28 0a 20 20 52 74 72 65 65 43 75 72 73  New(.  RtreeCurs
b520: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 2f 2a 20  or *pCur,    /* 
b530: 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  The cursor */.  
b540: 52 74 72 65 65 44 56 61 6c 75 65 20 72 53 63 6f  RtreeDValue rSco
b550: 72 65 2c 20 20 20 2f 2a 20 53 63 6f 72 65 20 66  re,   /* Score f
b560: 6f 72 20 74 68 65 20 6e 65 77 20 73 65 61 72 63  or the new searc
b570: 68 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  h point */.  u8 
b580: 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  iLevel          
b590: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f 72 20     /* Level for 
b5a0: 74 68 65 20 6e 65 77 20 73 65 61 72 63 68 20 70  the new search p
b5b0: 6f 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 52 74 72  oint */.){.  Rtr
b5c0: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
b5d0: 4e 65 77 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20  New, *pFirst;.  
b5e0: 70 46 69 72 73 74 20 3d 20 72 74 72 65 65 53 65  pFirst = rtreeSe
b5f0: 61 72 63 68 50 6f 69 6e 74 46 69 72 73 74 28 70  archPointFirst(p
b600: 43 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 61 6e  Cur);.  pCur->an
b610: 51 75 65 75 65 5b 69 4c 65 76 65 6c 5d 2b 2b 3b  Queue[iLevel]++;
b620: 0a 20 20 69 66 28 20 70 46 69 72 73 74 3d 3d 30  .  if( pFirst==0
b630: 0a 20 20 20 7c 7c 20 70 46 69 72 73 74 2d 3e 72  .   || pFirst->r
b640: 53 63 6f 72 65 3e 72 53 63 6f 72 65 20 0a 20 20  Score>rScore .  
b650: 20 7c 7c 20 28 70 46 69 72 73 74 2d 3e 72 53 63   || (pFirst->rSc
b660: 6f 72 65 3d 3d 72 53 63 6f 72 65 20 26 26 20 70  ore==rScore && p
b670: 46 69 72 73 74 2d 3e 69 4c 65 76 65 6c 3e 69 4c  First->iLevel>iL
b680: 65 76 65 6c 29 0a 20 20 29 7b 0a 20 20 20 20 69  evel).  ){.    i
b690: 66 28 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 20  f( pCur->bPoint 
b6a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
b6b0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 72 74  .      pNew = rt
b6c0: 72 65 65 45 6e 71 75 65 75 65 28 70 43 75 72 2c  reeEnqueue(pCur,
b6d0: 20 72 53 63 6f 72 65 2c 20 69 4c 65 76 65 6c 29   rScore, iLevel)
b6e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
b6f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b700: 20 20 20 20 20 20 69 69 20 3d 20 28 69 6e 74 29        ii = (int)
b710: 28 70 4e 65 77 20 2d 20 70 43 75 72 2d 3e 61 50  (pNew - pCur->aP
b720: 6f 69 6e 74 29 20 2b 20 31 3b 0a 20 20 20 20 20  oint) + 1;.     
b730: 20 69 66 28 20 69 69 3c 52 54 52 45 45 5f 43 41   if( ii<RTREE_CA
b740: 43 48 45 5f 53 5a 20 29 7b 0a 20 20 20 20 20 20  CHE_SZ ){.      
b750: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
b760: 61 4e 6f 64 65 5b 69 69 5d 3d 3d 30 20 29 3b 0a  aNode[ii]==0 );.
b770: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4e          pCur->aN
b780: 6f 64 65 5b 69 69 5d 20 3d 20 70 43 75 72 2d 3e  ode[ii] = pCur->
b790: 61 4e 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 20 20  aNode[0];.      
b7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
b7b0: 6f 64 65 52 65 6c 65 61 73 65 28 52 54 52 45 45  odeRelease(RTREE
b7c0: 5f 4f 46 5f 43 55 52 53 4f 52 28 70 43 75 72 29  _OF_CURSOR(pCur)
b7d0: 2c 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 30 5d  , pCur->aNode[0]
b7e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b7f0: 20 70 43 75 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20   pCur->aNode[0] 
b800: 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 4e 65 77  = 0;.      *pNew
b810: 20 3d 20 70 43 75 72 2d 3e 73 50 6f 69 6e 74 3b   = pCur->sPoint;
b820: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
b830: 3e 73 50 6f 69 6e 74 2e 72 53 63 6f 72 65 20 3d  >sPoint.rScore =
b840: 20 72 53 63 6f 72 65 3b 0a 20 20 20 20 70 43 75   rScore;.    pCu
b850: 72 2d 3e 73 50 6f 69 6e 74 2e 69 4c 65 76 65 6c  r->sPoint.iLevel
b860: 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 70   = iLevel;.    p
b870: 43 75 72 2d 3e 62 50 6f 69 6e 74 20 3d 20 31 3b  Cur->bPoint = 1;
b880: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 43 75  .    return &pCu
b890: 72 2d 3e 73 50 6f 69 6e 74 3b 0a 20 20 7d 65 6c  r->sPoint;.  }el
b8a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  se{.    return r
b8b0: 74 72 65 65 45 6e 71 75 65 75 65 28 70 43 75 72  treeEnqueue(pCur
b8c0: 2c 20 72 53 63 6f 72 65 2c 20 69 4c 65 76 65 6c  , rScore, iLevel
b8d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a  );.  }.}..#if 0.
b8e0: 2f 2a 20 54 72 61 63 69 6e 67 20 72 6f 75 74 69  /* Tracing routi
b8f0: 6e 65 73 20 66 6f 72 20 74 68 65 20 52 74 72 65  nes for the Rtre
b900: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 71 75 65  eSearchPoint que
b910: 75 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ue */.static voi
b920: 64 20 74 72 61 63 65 50 6f 69 6e 74 28 52 74 72  d tracePoint(Rtr
b930: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
b940: 2c 20 69 6e 74 20 69 64 78 2c 20 52 74 72 65 65  , int idx, Rtree
b950: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
b960: 20 69 66 28 20 69 64 78 3c 30 20 29 7b 20 70 72   if( idx<0 ){ pr
b970: 69 6e 74 66 28 22 20 73 22 29 3b 20 7d 65 6c 73  intf(" s"); }els
b980: 65 7b 20 70 72 69 6e 74 66 28 22 25 32 64 22 2c  e{ printf("%2d",
b990: 20 69 64 78 29 3b 20 7d 0a 20 20 70 72 69 6e 74   idx); }.  print
b9a0: 66 28 22 20 25 64 2e 25 30 35 6c 6c 64 2e 25 30  f(" %d.%05lld.%0
b9b0: 32 64 20 25 67 20 25 64 22 2c 0a 20 20 20 20 70  2d %g %d",.    p
b9c0: 2d 3e 69 4c 65 76 65 6c 2c 20 70 2d 3e 69 64 2c  ->iLevel, p->id,
b9d0: 20 70 2d 3e 69 43 65 6c 6c 2c 20 70 2d 3e 72 53   p->iCell, p->rS
b9e0: 63 6f 72 65 2c 20 70 2d 3e 65 57 69 74 68 69 6e  core, p->eWithin
b9f0: 0a 20 20 29 3b 0a 20 20 69 64 78 2b 2b 3b 0a 20  .  );.  idx++;. 
ba00: 20 69 66 28 20 69 64 78 3c 52 54 52 45 45 5f 43   if( idx<RTREE_C
ba10: 41 43 48 45 5f 53 5a 20 29 7b 0a 20 20 20 20 70  ACHE_SZ ){.    p
ba20: 72 69 6e 74 66 28 22 20 25 70 5c 6e 22 2c 20 70  rintf(" %p\n", p
ba30: 43 75 72 2d 3e 61 4e 6f 64 65 5b 69 64 78 5d 29  Cur->aNode[idx])
ba40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ba50: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
ba60: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
ba70: 72 61 63 65 51 75 65 75 65 28 52 74 72 65 65 43  raceQueue(RtreeC
ba80: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 63 6f 6e  ursor *pCur, con
ba90: 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78  st char *zPrefix
baa0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 70  ){.  int ii;.  p
bab0: 72 69 6e 74 66 28 22 3d 3d 3d 20 25 39 73 20 22  rintf("=== %9s "
bac0: 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 69 66  , zPrefix);.  if
bad0: 28 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 20 29  ( pCur->bPoint )
bae0: 7b 0a 20 20 20 20 74 72 61 63 65 50 6f 69 6e 74  {.    tracePoint
baf0: 28 26 70 43 75 72 2d 3e 73 50 6f 69 6e 74 2c 20  (&pCur->sPoint, 
bb00: 2d 31 2c 20 70 43 75 72 29 3b 0a 20 20 7d 0a 20  -1, pCur);.  }. 
bb10: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
bb20: 75 72 2d 3e 6e 50 6f 69 6e 74 3b 20 69 69 2b 2b  ur->nPoint; ii++
bb30: 29 7b 0a 20 20 20 20 69 66 28 20 69 69 3e 30 20  ){.    if( ii>0 
bb40: 7c 7c 20 70 43 75 72 2d 3e 62 50 6f 69 6e 74 20  || pCur->bPoint 
bb50: 29 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20  ) printf("      
bb60: 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20          ");.    
bb70: 74 72 61 63 65 50 6f 69 6e 74 28 26 70 43 75 72  tracePoint(&pCur
bb80: 2d 3e 61 50 6f 69 6e 74 5b 69 69 5d 2c 20 69 69  ->aPoint[ii], ii
bb90: 2c 20 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 23  , pCur);.  }.}.#
bba0: 20 64 65 66 69 6e 65 20 52 54 52 45 45 5f 51 55   define RTREE_QU
bbb0: 45 55 45 5f 54 52 41 43 45 28 41 2c 42 29 20 74  EUE_TRACE(A,B) t
bbc0: 72 61 63 65 51 75 65 75 65 28 41 2c 42 29 0a 23  raceQueue(A,B).#
bbd0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 54  else.# define RT
bbe0: 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28  REE_QUEUE_TRACE(
bbf0: 41 2c 42 29 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  A,B)   /* no-op 
bc00: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 52 65  */.#endif../* Re
bc10: 6d 6f 76 65 20 74 68 65 20 73 65 61 72 63 68 20  move the search 
bc20: 70 6f 69 6e 74 20 77 69 74 68 20 74 68 65 20 6c  point with the l
bc30: 6f 77 65 73 74 20 63 75 72 72 65 6e 74 20 73 63  owest current sc
bc40: 6f 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ore..*/.static v
bc50: 6f 69 64 20 72 74 72 65 65 53 65 61 72 63 68 50  oid rtreeSearchP
bc60: 6f 69 6e 74 50 6f 70 28 52 74 72 65 65 43 75 72  ointPop(RtreeCur
bc70: 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  sor *p){.  int i
bc80: 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 20 3d  , j, k, n;.  i =
bc90: 20 31 20 2d 20 70 2d 3e 62 50 6f 69 6e 74 3b 0a   1 - p->bPoint;.
bca0: 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 7c    assert( i==0 |
bcb0: 7c 20 69 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  | i==1 );.  if( 
bcc0: 70 2d 3e 61 4e 6f 64 65 5b 69 5d 20 29 7b 0a 20  p->aNode[i] ){. 
bcd0: 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 52     nodeRelease(R
bce0: 54 52 45 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70  TREE_OF_CURSOR(p
bcf0: 29 2c 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d 29 3b  ), p->aNode[i]);
bd00: 0a 20 20 20 20 70 2d 3e 61 4e 6f 64 65 5b 69 5d  .    p->aNode[i]
bd10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
bd20: 70 2d 3e 62 50 6f 69 6e 74 20 29 7b 0a 20 20 20  p->bPoint ){.   
bd30: 20 70 2d 3e 61 6e 51 75 65 75 65 5b 70 2d 3e 73   p->anQueue[p->s
bd40: 50 6f 69 6e 74 2e 69 4c 65 76 65 6c 5d 2d 2d 3b  Point.iLevel]--;
bd50: 0a 20 20 20 20 70 2d 3e 62 50 6f 69 6e 74 20 3d  .    p->bPoint =
bd60: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
bd70: 70 2d 3e 6e 50 6f 69 6e 74 20 29 7b 0a 20 20 20  p->nPoint ){.   
bd80: 20 70 2d 3e 61 6e 51 75 65 75 65 5b 70 2d 3e 61   p->anQueue[p->a
bd90: 50 6f 69 6e 74 5b 30 5d 2e 69 4c 65 76 65 6c 5d  Point[0].iLevel]
bda0: 2d 2d 3b 0a 20 20 20 20 6e 20 3d 20 2d 2d 70 2d  --;.    n = --p-
bdb0: 3e 6e 50 6f 69 6e 74 3b 0a 20 20 20 20 70 2d 3e  >nPoint;.    p->
bdc0: 61 50 6f 69 6e 74 5b 30 5d 20 3d 20 70 2d 3e 61  aPoint[0] = p->a
bdd0: 50 6f 69 6e 74 5b 6e 5d 3b 0a 20 20 20 20 69 66  Point[n];.    if
bde0: 28 20 6e 3c 52 54 52 45 45 5f 43 41 43 48 45 5f  ( n<RTREE_CACHE_
bdf0: 53 5a 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 2d  SZ-1 ){.      p-
be00: 3e 61 4e 6f 64 65 5b 31 5d 20 3d 20 70 2d 3e 61  >aNode[1] = p->a
be10: 4e 6f 64 65 5b 6e 2b 31 5d 3b 0a 20 20 20 20 20  Node[n+1];.     
be20: 20 70 2d 3e 61 4e 6f 64 65 5b 6e 2b 31 5d 20 3d   p->aNode[n+1] =
be30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   0;.    }.    i 
be40: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
be50: 28 6a 20 3d 20 69 2a 32 2b 31 29 3c 6e 20 29 7b  (j = i*2+1)<n ){
be60: 0a 20 20 20 20 20 20 6b 20 3d 20 6a 2b 31 3b 0a  .      k = j+1;.
be70: 20 20 20 20 20 20 69 66 28 20 6b 3c 6e 20 26 26        if( k<n &&
be80: 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e   rtreeSearchPoin
be90: 74 43 6f 6d 70 61 72 65 28 26 70 2d 3e 61 50 6f  tCompare(&p->aPo
bea0: 69 6e 74 5b 6b 5d 2c 20 26 70 2d 3e 61 50 6f 69  int[k], &p->aPoi
beb0: 6e 74 5b 6a 5d 29 3c 30 20 29 7b 0a 20 20 20 20  nt[j])<0 ){.    
bec0: 20 20 20 20 69 66 28 20 72 74 72 65 65 53 65 61      if( rtreeSea
bed0: 72 63 68 50 6f 69 6e 74 43 6f 6d 70 61 72 65 28  rchPointCompare(
bee0: 26 70 2d 3e 61 50 6f 69 6e 74 5b 6b 5d 2c 20 26  &p->aPoint[k], &
bef0: 70 2d 3e 61 50 6f 69 6e 74 5b 69 5d 29 3c 30 20  p->aPoint[i])<0 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 74 72  ){.          rtr
bf10: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 53 77 61  eeSearchPointSwa
bf20: 70 28 70 2c 20 69 2c 20 6b 29 3b 0a 20 20 20 20  p(p, i, k);.    
bf30: 20 20 20 20 20 20 69 20 3d 20 6b 3b 0a 20 20 20        i = k;.   
bf40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
bf70: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
bf80: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
bf90: 43 6f 6d 70 61 72 65 28 26 70 2d 3e 61 50 6f 69  Compare(&p->aPoi
bfa0: 6e 74 5b 6a 5d 2c 20 26 70 2d 3e 61 50 6f 69 6e  nt[j], &p->aPoin
bfb0: 74 5b 69 5d 29 3c 30 20 29 7b 0a 20 20 20 20 20  t[i])<0 ){.     
bfc0: 20 20 20 20 20 72 74 72 65 65 53 65 61 72 63 68       rtreeSearch
bfd0: 50 6f 69 6e 74 53 77 61 70 28 70 2c 20 69 2c 20  PointSwap(p, i, 
bfe0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  j);.          i 
bff0: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = j;.        }el
c000: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se{.          br
c010: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c020: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c030: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 69  .}.../*.** Conti
c040: 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20 6f  nue the search o
c050: 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 75 6e  n cursor pCur un
c060: 74 69 6c 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  til the front of
c070: 20 74 68 65 20 71 75 65 75 65 0a 2a 2a 20 63 6f   the queue.** co
c080: 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20  ntains an entry 
c090: 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 65 74  suitable for ret
c0a0: 75 72 6e 69 6e 67 20 61 73 20 61 20 72 65 73 75  urning as a resu
c0b0: 6c 74 2d 73 65 74 20 72 6f 77 2c 0a 2a 2a 20 6f  lt-set row,.** o
c0c0: 72 20 75 6e 74 69 6c 20 74 68 65 20 52 74 72 65  r until the Rtre
c0d0: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 71 75 65  eSearchPoint que
c0e0: 75 65 20 69 73 20 65 6d 70 74 79 2c 20 69 6e 64  ue is empty, ind
c0f0: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
c100: 0a 2a 2a 20 71 75 65 72 79 20 68 61 73 20 63 6f  .** query has co
c110: 6d 70 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mpleted..*/.stat
c120: 69 63 20 69 6e 74 20 72 74 72 65 65 53 74 65 70  ic int rtreeStep
c130: 54 6f 4c 65 61 66 28 52 74 72 65 65 43 75 72 73  ToLeaf(RtreeCurs
c140: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 52 74 72  or *pCur){.  Rtr
c150: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
c160: 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  ;.  Rtree *pRtre
c170: 65 20 3d 20 52 54 52 45 45 5f 4f 46 5f 43 55 52  e = RTREE_OF_CUR
c180: 53 4f 52 28 70 43 75 72 29 3b 0a 20 20 52 74 72  SOR(pCur);.  Rtr
c190: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  eeNode *pNode;. 
c1a0: 20 69 6e 74 20 65 57 69 74 68 69 6e 3b 0a 20 20   int eWithin;.  
c1b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c1c0: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  OK;.  int nCell;
c1d0: 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
c1e0: 6e 74 20 3d 20 70 43 75 72 2d 3e 6e 43 6f 6e 73  nt = pCur->nCons
c1f0: 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69  traint;.  int ii
c200: 3b 0a 20 20 69 6e 74 20 65 49 6e 74 3b 0a 20 20  ;.  int eInt;.  
c210: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
c220: 20 78 3b 0a 0a 20 20 65 49 6e 74 20 3d 20 70 52   x;..  eInt = pR
c230: 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65  tree->eCoordType
c240: 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e  ==RTREE_COORD_IN
c250: 54 33 32 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  T32;.  while( (p
c260: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
c270: 69 6e 74 46 69 72 73 74 28 70 43 75 72 29 29 21  intFirst(pCur))!
c280: 3d 30 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  =0 && p->iLevel>
c290: 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  0 ){.    pNode =
c2a0: 20 72 74 72 65 65 4e 6f 64 65 4f 66 46 69 72 73   rtreeNodeOfFirs
c2b0: 74 53 65 61 72 63 68 50 6f 69 6e 74 28 70 43 75  tSearchPoint(pCu
c2c0: 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  r, &rc);.    if(
c2d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c2e0: 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45  .    nCell = NCE
c2f0: 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 61  LL(pNode);.    a
c300: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 32 30 30  ssert( nCell<200
c310: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
c320: 2d 3e 69 43 65 6c 6c 3c 6e 43 65 6c 6c 20 29 7b  ->iCell<nCell ){
c330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
c340: 74 72 65 65 5f 64 62 6c 20 72 53 63 6f 72 65 20  tree_dbl rScore 
c350: 3d 20 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  = (sqlite3_rtree
c360: 5f 64 62 6c 29 2d 31 3b 0a 20 20 20 20 20 20 75  _dbl)-1;.      u
c370: 38 20 2a 70 43 65 6c 6c 44 61 74 61 20 3d 20 70  8 *pCellData = p
c380: 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 2b 20 28 34  Node->zData + (4
c390: 2b 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50  +pRtree->nBytesP
c3a0: 65 72 43 65 6c 6c 2a 70 2d 3e 69 43 65 6c 6c 29  erCell*p->iCell)
c3b0: 3b 0a 20 20 20 20 20 20 65 57 69 74 68 69 6e 20  ;.      eWithin 
c3c0: 3d 20 46 55 4c 4c 59 5f 57 49 54 48 49 4e 3b 0a  = FULLY_WITHIN;.
c3d0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
c3e0: 69 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  ii<nConstraint; 
c3f0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 52  ii++){.        R
c400: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
c410: 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 43  pConstraint = pC
c420: 75 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  ur->aConstraint 
c430: 2b 20 69 69 3b 0a 20 20 20 20 20 20 20 20 69 66  + ii;.        if
c440: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
c450: 70 3e 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29  p>=RTREE_MATCH )
c460: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c470: 20 72 74 72 65 65 43 61 6c 6c 62 61 63 6b 43 6f   rtreeCallbackCo
c480: 6e 73 74 72 61 69 6e 74 28 70 43 6f 6e 73 74 72  nstraint(pConstr
c490: 61 69 6e 74 2c 20 65 49 6e 74 2c 20 70 43 65 6c  aint, eInt, pCel
c4a0: 6c 44 61 74 61 2c 20 70 2c 0a 20 20 20 20 20 20  lData, p,.      
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 26 72 53 63 6f 72 65 2c 20 26 65 57 69 74 68   &rScore, &eWith
c4e0: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  in);.          i
c4f0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c500: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
c510: 20 69 66 28 20 70 2d 3e 69 4c 65 76 65 6c 3d 3d   if( p->iLevel==
c520: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
c530: 74 72 65 65 4c 65 61 66 43 6f 6e 73 74 72 61 69  treeLeafConstrai
c540: 6e 74 28 70 43 6f 6e 73 74 72 61 69 6e 74 2c 20  nt(pConstraint, 
c550: 65 49 6e 74 2c 20 70 43 65 6c 6c 44 61 74 61 2c  eInt, pCellData,
c560: 20 26 65 57 69 74 68 69 6e 29 3b 0a 20 20 20 20   &eWithin);.    
c570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c580: 20 20 20 20 20 72 74 72 65 65 4e 6f 6e 6c 65 61       rtreeNonlea
c590: 66 43 6f 6e 73 74 72 61 69 6e 74 28 70 43 6f 6e  fConstraint(pCon
c5a0: 73 74 72 61 69 6e 74 2c 20 65 49 6e 74 2c 20 70  straint, eInt, p
c5b0: 43 65 6c 6c 44 61 74 61 2c 20 26 65 57 69 74 68  CellData, &eWith
c5c0: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
c5d0: 20 20 20 20 20 20 20 69 66 28 20 65 57 69 74 68         if( eWith
c5e0: 69 6e 3d 3d 4e 4f 54 5f 57 49 54 48 49 4e 20 29  in==NOT_WITHIN )
c5f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c600: 20 20 20 20 20 20 70 2d 3e 69 43 65 6c 6c 2b 2b        p->iCell++
c610: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 57 69 74  ;.      if( eWit
c620: 68 69 6e 3d 3d 4e 4f 54 5f 57 49 54 48 49 4e 20  hin==NOT_WITHIN 
c630: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c640: 20 20 78 2e 69 4c 65 76 65 6c 20 3d 20 70 2d 3e    x.iLevel = p->
c650: 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
c660: 20 20 69 66 28 20 78 2e 69 4c 65 76 65 6c 20 29    if( x.iLevel )
c670: 7b 0a 20 20 20 20 20 20 20 20 78 2e 69 64 20 3d  {.        x.id =
c680: 20 72 65 61 64 49 6e 74 36 34 28 70 43 65 6c 6c   readInt64(pCell
c690: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 78  Data);.        x
c6a0: 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  .iCell = 0;.    
c6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c6c0: 20 78 2e 69 64 20 3d 20 70 2d 3e 69 64 3b 0a 20   x.id = p->id;. 
c6d0: 20 20 20 20 20 20 20 78 2e 69 43 65 6c 6c 20 3d         x.iCell =
c6e0: 20 70 2d 3e 69 43 65 6c 6c 20 2d 20 31 3b 0a 20   p->iCell - 1;. 
c6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c700: 20 70 2d 3e 69 43 65 6c 6c 3e 3d 6e 43 65 6c 6c   p->iCell>=nCell
c710: 20 29 7b 0a 20 20 20 20 20 20 20 20 52 54 52 45   ){.        RTRE
c720: 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28 70 43  E_QUEUE_TRACE(pC
c730: 75 72 2c 20 22 50 4f 50 2d 53 3a 22 29 3b 0a 20  ur, "POP-S:");. 
c740: 20 20 20 20 20 20 20 72 74 72 65 65 53 65 61 72         rtreeSear
c750: 63 68 50 6f 69 6e 74 50 6f 70 28 70 43 75 72 29  chPointPop(pCur)
c760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c770: 69 66 28 20 72 53 63 6f 72 65 3c 52 54 52 45 45  if( rScore<RTREE
c780: 5f 5a 45 52 4f 20 29 20 72 53 63 6f 72 65 20 3d  _ZERO ) rScore =
c790: 20 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 20 20 20   RTREE_ZERO;.   
c7a0: 20 20 20 70 20 3d 20 72 74 72 65 65 53 65 61 72     p = rtreeSear
c7b0: 63 68 50 6f 69 6e 74 4e 65 77 28 70 43 75 72 2c  chPointNew(pCur,
c7c0: 20 72 53 63 6f 72 65 2c 20 78 2e 69 4c 65 76 65   rScore, x.iLeve
c7d0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3d  l);.      if( p=
c7e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
c7f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c800: 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 28 75 38  p->eWithin = (u8
c810: 29 65 57 69 74 68 69 6e 3b 0a 20 20 20 20 20 20  )eWithin;.      
c820: 70 2d 3e 69 64 20 3d 20 78 2e 69 64 3b 0a 20 20  p->id = x.id;.  
c830: 20 20 20 20 70 2d 3e 69 43 65 6c 6c 20 3d 20 78      p->iCell = x
c840: 2e 69 43 65 6c 6c 3b 0a 20 20 20 20 20 20 52 54  .iCell;.      RT
c850: 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43 45 28  REE_QUEUE_TRACE(
c860: 70 43 75 72 2c 20 22 50 55 53 48 2d 53 3a 22 29  pCur, "PUSH-S:")
c870: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c880: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
c890: 69 43 65 6c 6c 3e 3d 6e 43 65 6c 6c 20 29 7b 0a  iCell>=nCell ){.
c8a0: 20 20 20 20 20 20 52 54 52 45 45 5f 51 55 45 55        RTREE_QUEU
c8b0: 45 5f 54 52 41 43 45 28 70 43 75 72 2c 20 22 50  E_TRACE(pCur, "P
c8c0: 4f 50 2d 53 65 3a 22 29 3b 0a 20 20 20 20 20 20  OP-Se:");.      
c8d0: 72 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  rtreeSearchPoint
c8e0: 50 6f 70 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  Pop(pCur);.    }
c8f0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 45  .  }.  pCur->atE
c900: 4f 46 20 3d 20 70 3d 3d 30 3b 0a 20 20 72 65 74  OF = p==0;.  ret
c910: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c920: 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76  ../* .** Rtree v
c930: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
c940: 75 6c 65 20 78 4e 65 78 74 20 6d 65 74 68 6f 64  ule xNext method
c950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c960: 72 74 72 65 65 4e 65 78 74 28 73 71 6c 69 74 65  rtreeNext(sqlite
c970: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
c980: 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 52  VtabCursor){.  R
c990: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  treeCursor *pCsr
c9a0: 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20   = (RtreeCursor 
c9b0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
c9c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c9d0: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  _OK;..  /* Move 
c9e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
c9f0: 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  y that matches t
ca00: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63 6f  he configured co
ca10: 6e 73 74 72 61 69 6e 74 73 2e 20 2a 2f 0a 20 20  nstraints. */.  
ca20: 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43  RTREE_QUEUE_TRAC
ca30: 45 28 70 43 73 72 2c 20 22 50 4f 50 2d 4e 78 3a  E(pCsr, "POP-Nx:
ca40: 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  ");.  if( pCsr->
ca50: 62 41 75 78 56 61 6c 69 64 20 29 7b 0a 20 20 20  bAuxValid ){.   
ca60: 20 70 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64   pCsr->bAuxValid
ca70: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
ca80: 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 52  3_reset(pCsr->pR
ca90: 65 61 64 41 75 78 29 3b 0a 20 20 7d 0a 20 20 72  eadAux);.  }.  r
caa0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 50  treeSearchPointP
cab0: 6f 70 28 70 43 73 72 29 3b 0a 20 20 72 63 20 3d  op(pCsr);.  rc =
cac0: 20 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66   rtreeStepToLeaf
cad0: 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
cae0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52   rc;.}../* .** R
caf0: 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
cb00: 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69 64  le module xRowid
cb10: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
cb20: 69 63 20 69 6e 74 20 72 74 72 65 65 52 6f 77 69  ic int rtreeRowi
cb30: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
cb40: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
cb50: 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
cb60: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 52 74 72   *pRowid){.  Rtr
cb70: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  eeCursor *pCsr =
cb80: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
cb90: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 52  pVtabCursor;.  R
cba0: 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20  treeSearchPoint 
cbb0: 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68  *p = rtreeSearch
cbc0: 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73 72 29  PointFirst(pCsr)
cbd0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
cbe0: 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e  ITE_OK;.  RtreeN
cbf0: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74 72  ode *pNode = rtr
cc00: 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61  eeNodeOfFirstSea
cc10: 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c 20 26  rchPoint(pCsr, &
cc20: 72 63 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  rc);.  if( rc==S
cc30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 20 29 7b  QLITE_OK && p ){
cc40: 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 6e  .    *pRowid = n
cc50: 6f 64 65 47 65 74 52 6f 77 69 64 28 52 54 52 45  odeGetRowid(RTRE
cc60: 45 5f 4f 46 5f 43 55 52 53 4f 52 28 70 43 73 72  E_OF_CURSOR(pCsr
cc70: 29 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69 43 65  ), pNode, p->iCe
cc80: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ll);.  }.  retur
cc90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
cca0: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
ccb0: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75  ble module xColu
ccc0: 6d 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  mn method..*/.st
ccd0: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 43 6f  atic int rtreeCo
cce0: 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  lumn(sqlite3_vta
ccf0: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
cd00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
cd10: 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52  ctx, int i){.  R
cd20: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
cd30: 52 74 72 65 65 20 2a 29 63 75 72 2d 3e 70 56 74  Rtree *)cur->pVt
cd40: 61 62 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f  ab;.  RtreeCurso
cd50: 72 20 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65  r *pCsr = (Rtree
cd60: 43 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  Cursor *)cur;.  
cd70: 52 74 72 65 65 53 65 61 72 63 68 50 6f 69 6e 74  RtreeSearchPoint
cd80: 20 2a 70 20 3d 20 72 74 72 65 65 53 65 61 72 63   *p = rtreeSearc
cd90: 68 50 6f 69 6e 74 46 69 72 73 74 28 70 43 73 72  hPointFirst(pCsr
cda0: 29 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20  );.  RtreeCoord 
cdb0: 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  c;.  int rc = SQ
cdc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65  LITE_OK;.  Rtree
cdd0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74  Node *pNode = rt
cde0: 72 65 65 4e 6f 64 65 4f 66 46 69 72 73 74 53 65  reeNodeOfFirstSe
cdf0: 61 72 63 68 50 6f 69 6e 74 28 70 43 73 72 2c 20  archPoint(pCsr, 
ce00: 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63 20  &rc);..  if( rc 
ce10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
ce20: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
ce30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
ce40: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( i==0 ){.    sq
ce50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ce60: 36 34 28 63 74 78 2c 20 6e 6f 64 65 47 65 74 52  64(ctx, nodeGetR
ce70: 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 4e 6f  owid(pRtree, pNo
ce80: 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29 29 3b 0a  de, p->iCell));.
ce90: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 3d 70    }else if( i<=p
cea0: 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 29 7b 0a  Rtree->nDim2 ){.
ceb0: 20 20 20 20 6e 6f 64 65 47 65 74 43 6f 6f 72 64      nodeGetCoord
cec0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
ced0: 70 2d 3e 69 43 65 6c 6c 2c 20 69 2d 31 2c 20 26  p->iCell, i-1, &
cee0: 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c);.#ifndef SQLI
cef0: 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c  TE_RTREE_INT_ONL
cf00: 59 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65  Y.    if( pRtree
cf10: 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54  ->eCoordType==RT
cf20: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
cf30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cf40: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
cf50: 63 74 78 2c 20 63 2e 66 29 3b 0a 20 20 20 20 7d  ctx, c.f);.    }
cf60: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
cf70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cf80: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
cf90: 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f  pe==RTREE_COORD_
cfa0: 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20 73  INT32 );.      s
cfb0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
cfc0: 74 28 63 74 78 2c 20 63 2e 69 29 3b 0a 20 20 20  t(ctx, c.i);.   
cfd0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cfe0: 69 66 28 20 21 70 43 73 72 2d 3e 62 41 75 78 56  if( !pCsr->bAuxV
cff0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66  alid ){.      if
d000: 28 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  ( pCsr->pReadAux
d010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
d020: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
d030: 61 72 65 5f 76 33 28 70 52 74 72 65 65 2d 3e 64  are_v3(pRtree->d
d040: 62 2c 20 70 52 74 72 65 65 2d 3e 7a 52 65 61 64  b, pRtree->zRead
d050: 41 75 78 53 71 6c 2c 20 2d 31 2c 20 30 2c 0a 20  AuxSql, -1, 0,. 
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d080: 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 2c 20  pCsr->pReadAux, 
d090: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
d0a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d0c0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
d0d0: 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78 2c  (pCsr->pReadAux,
d0e0: 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e   1, .          n
d0f0: 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74 72  odeGetRowid(pRtr
d100: 65 65 2c 20 70 4e 6f 64 65 2c 20 70 2d 3e 69 43  ee, pNode, p->iC
d110: 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 72 63 20  ell));.      rc 
d120: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
d130: 43 73 72 2d 3e 70 52 65 61 64 41 75 78 29 3b 0a  Csr->pReadAux);.
d140: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
d150: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
d160: 20 20 20 20 70 43 73 72 2d 3e 62 41 75 78 56 61      pCsr->bAuxVa
d170: 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lid = 1;.      }
d180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d190: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72  lite3_reset(pCsr
d1a0: 2d 3e 70 52 65 61 64 41 75 78 29 3b 0a 20 20 20  ->pReadAux);.   
d1b0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d1c0: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
d1d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d1e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d1f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d200: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
d210: 61 6c 75 65 28 63 74 78 2c 0a 20 20 20 20 20 20  alue(ctx,.      
d220: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
d230: 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 52  n_value(pCsr->pR
d240: 65 61 64 41 75 78 2c 20 69 20 2d 20 70 52 74 72  eadAux, i - pRtr
d250: 65 65 2d 3e 6e 44 69 6d 32 20 2b 20 31 29 29 3b  ee->nDim2 + 1));
d260: 0a 20 20 7d 20 20 0a 20 20 72 65 74 75 72 6e 20  .  }  .  return 
d270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d280: 20 0a 2a 2a 20 55 73 65 20 6e 6f 64 65 41 63 71   .** Use nodeAcq
d290: 75 69 72 65 28 29 20 74 6f 20 6f 62 74 61 69 6e  uire() to obtain
d2a0: 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 63   the leaf node c
d2b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
d2c0: 63 6f 72 64 20 77 69 74 68 20 0a 2a 2a 20 72 6f  cord with .** ro
d2d0: 77 69 64 20 69 52 6f 77 69 64 2e 20 49 66 20 73  wid iRowid. If s
d2e0: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
d2f0: 70 70 4c 65 61 66 20 74 6f 20 70 6f 69 6e 74 20  ppLeaf to point 
d300: 74 6f 20 74 68 65 20 6e 6f 64 65 20 61 6e 64 0a  to the node and.
d310: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
d320: 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
d330: 20 6e 6f 20 73 75 63 68 20 72 65 63 6f 72 64 20   no such record 
d340: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 73 65  in the table, se
d350: 74 0a 2a 2a 20 2a 70 70 4c 65 61 66 20 74 6f 20  t.** *ppLeaf to 
d360: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
d370: 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72  ITE_OK. If an er
d380: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d390: 2a 70 70 4c 65 61 66 0a 2a 2a 20 74 6f 20 7a 65  *ppLeaf.** to ze
d3a0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
d3b0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
d3c0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
d3d0: 74 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 0a  t findLeafNode(.
d3e0: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d400: 20 52 54 72 65 65 20 74 6f 20 73 65 61 72 63 68   RTree to search
d410: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
d420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d430: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 73    /* The rowid s
d440: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
d450: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70    RtreeNode **pp
d460: 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 2f 2a  Leaf,         /*
d470: 20 57 72 69 74 65 20 74 68 65 20 6e 6f 64 65 20   Write the node 
d480: 68 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  here */.  sqlite
d490: 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 64 65 20  3_int64 *piNode 
d4a0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
d4b0: 68 65 20 6e 6f 64 65 2d 69 64 20 68 65 72 65 20  he node-id here 
d4c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d4d0: 20 20 2a 70 70 4c 65 61 66 20 3d 20 30 3b 0a 20    *ppLeaf = 0;. 
d4e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
d4f0: 74 36 34 28 70 52 74 72 65 65 2d 3e 70 52 65 61  t64(pRtree->pRea
d500: 64 52 6f 77 69 64 2c 20 31 2c 20 69 52 6f 77 69  dRowid, 1, iRowi
d510: 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  d);.  if( sqlite
d520: 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
d530: 52 65 61 64 52 6f 77 69 64 29 3d 3d 53 51 4c 49  ReadRowid)==SQLI
d540: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 36  TE_ROW ){.    i6
d550: 34 20 69 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  4 iNode = sqlite
d560: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
d570: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
d580: 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  d, 0);.    if( p
d590: 69 4e 6f 64 65 20 29 20 2a 70 69 4e 6f 64 65 20  iNode ) *piNode 
d5a0: 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 72 63 20  = iNode;.    rc 
d5b0: 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
d5c0: 74 72 65 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20  tree, iNode, 0, 
d5d0: 70 70 4c 65 61 66 29 3b 0a 20 20 20 20 73 71 6c  ppLeaf);.    sql
d5e0: 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
d5f0: 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 29 3b 0a  e->pReadRowid);.
d600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d610: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
d620: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
d630: 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
d640: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d660: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6e 66 69 67  called to config
d670: 75 72 65 20 74 68 65 20 52 74 72 65 65 43 6f 6e  ure the RtreeCon
d680: 73 74 72 61 69 6e 74 20 6f 62 6a 65 63 74 20 70  straint object p
d690: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
d6a0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d6b0: 66 6f 72 20 61 20 4d 41 54 43 48 20 63 6f 6e 73  for a MATCH cons
d6c0: 74 72 61 69 6e 74 2e 20 54 68 65 20 76 61 6c 75  traint. The valu
d6d0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
d6e0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
d6f0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
d700: 6f 6e 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  on is the right-
d710: 68 61 6e 64 20 6f 70 65 72 61 6e 64 20 74 6f 20  hand operand to 
d720: 74 68 65 20 4d 41 54 43 48 0a 2a 2a 20 6f 70 65  the MATCH.** ope
d730: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
d740: 20 69 6e 74 20 64 65 73 65 72 69 61 6c 69 7a 65   int deserialize
d750: 47 65 6f 6d 65 74 72 79 28 73 71 6c 69 74 65 33  Geometry(sqlite3
d760: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 2c 20  _value *pValue, 
d770: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20  RtreeConstraint 
d780: 2a 70 43 6f 6e 73 29 7b 0a 20 20 52 74 72 65 65  *pCons){.  Rtree
d790: 4d 61 74 63 68 41 72 67 20 2a 70 42 6c 6f 62 2c  MatchArg *pBlob,
d7a0: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a   *pSrc;       /*
d7b0: 20 42 4c 4f 42 20 72 65 74 75 72 6e 65 64 20 62   BLOB returned b
d7c0: 79 20 67 65 6f 6d 65 74 72 79 20 66 75 6e 63 74  y geometry funct
d7d0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
d7e0: 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66  _rtree_query_inf
d7f0: 6f 20 2a 70 49 6e 66 6f 3b 20 20 20 2f 2a 20 43  o *pInfo;   /* C
d800: 61 6c 6c 62 61 63 6b 20 69 6e 66 6f 72 6d 61 74  allback informat
d810: 69 6f 6e 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ion */..  pSrc =
d820: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 70   sqlite3_value_p
d830: 6f 69 6e 74 65 72 28 70 56 61 6c 75 65 2c 20 22  ointer(pValue, "
d840: 52 74 72 65 65 4d 61 74 63 68 41 72 67 22 29 3b  RtreeMatchArg");
d850: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
d860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d870: 52 52 4f 52 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  RROR;.  pInfo = 
d880: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71  (sqlite3_rtree_q
d890: 75 65 72 79 5f 69 6e 66 6f 2a 29 0a 20 20 20 20  uery_info*).    
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d8b0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
d8c0: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 2b 70 53 72  zeof(*pInfo)+pSr
d8d0: 63 2d 3e 69 53 69 7a 65 20 29 3b 0a 20 20 69 66  c->iSize );.  if
d8e0: 28 20 21 70 49 6e 66 6f 20 29 20 72 65 74 75 72  ( !pInfo ) retur
d8f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d900: 20 20 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2c 20    memset(pInfo, 
d910: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f  0, sizeof(*pInfo
d920: 29 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28 52  ));.  pBlob = (R
d930: 74 72 65 65 4d 61 74 63 68 41 72 67 2a 29 26 70  treeMatchArg*)&p
d940: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  Info[1];.  memcp
d950: 79 28 70 42 6c 6f 62 2c 20 70 53 72 63 2c 20 70  y(pBlob, pSrc, p
d960: 53 72 63 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 70  Src->iSize);.  p
d970: 49 6e 66 6f 2d 3e 70 43 6f 6e 74 65 78 74 20 3d  Info->pContext =
d980: 20 70 42 6c 6f 62 2d 3e 63 62 2e 70 43 6f 6e 74   pBlob->cb.pCont
d990: 65 78 74 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ext;.  pInfo->nP
d9a0: 61 72 61 6d 20 3d 20 70 42 6c 6f 62 2d 3e 6e 50  aram = pBlob->nP
d9b0: 61 72 61 6d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  aram;.  pInfo->a
d9c0: 50 61 72 61 6d 20 3d 20 70 42 6c 6f 62 2d 3e 61  Param = pBlob->a
d9d0: 50 61 72 61 6d 3b 0a 20 20 70 49 6e 66 6f 2d 3e  Param;.  pInfo->
d9e0: 61 70 53 71 6c 50 61 72 61 6d 20 3d 20 70 42 6c  apSqlParam = pBl
d9f0: 6f 62 2d 3e 61 70 53 71 6c 50 61 72 61 6d 3b 0a  ob->apSqlParam;.
da00: 0a 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 63 62  .  if( pBlob->cb
da10: 2e 78 47 65 6f 6d 20 29 7b 0a 20 20 20 20 70 43  .xGeom ){.    pC
da20: 6f 6e 73 2d 3e 75 2e 78 47 65 6f 6d 20 3d 20 70  ons->u.xGeom = p
da30: 42 6c 6f 62 2d 3e 63 62 2e 78 47 65 6f 6d 3b 0a  Blob->cb.xGeom;.
da40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
da50: 6e 73 2d 3e 6f 70 20 3d 20 52 54 52 45 45 5f 51  ns->op = RTREE_Q
da60: 55 45 52 59 3b 0a 20 20 20 20 70 43 6f 6e 73 2d  UERY;.    pCons-
da70: 3e 75 2e 78 51 75 65 72 79 46 75 6e 63 20 3d 20  >u.xQueryFunc = 
da80: 70 42 6c 6f 62 2d 3e 63 62 2e 78 51 75 65 72 79  pBlob->cb.xQuery
da90: 46 75 6e 63 3b 0a 20 20 7d 0a 20 20 70 43 6f 6e  Func;.  }.  pCon
daa0: 73 2d 3e 70 49 6e 66 6f 20 3d 20 70 49 6e 66 6f  s->pInfo = pInfo
dab0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dac0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  E_OK;.}../* .** 
dad0: 52 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  Rtree virtual ta
dae0: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c 74  ble module xFilt
daf0: 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  er method..*/.st
db00: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 46 69  atic int rtreeFi
db10: 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
db20: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
db30: 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  abCursor, .  int
db40: 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
db50: 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
db60: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
db70: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
db80: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
db90: 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61   = (Rtree *)pVta
dba0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a  bCursor->pVtab;.
dbb0: 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70    RtreeCursor *p
dbc0: 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73  Csr = (RtreeCurs
dbd0: 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72  or *)pVtabCursor
dbe0: 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ;.  RtreeNode *p
dbf0: 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Root = 0;.  int 
dc00: 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ii;.  int rc = S
dc10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
dc20: 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  iCell = 0;.  sql
dc30: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
dc40: 3b 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65  ;..  rtreeRefere
dc50: 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 0a 20 20  nce(pRtree);..  
dc60: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63 75 72  /* Reset the cur
dc70: 73 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20  sor to the same 
dc80: 73 74 61 74 65 20 61 73 20 72 74 72 65 65 4f 70  state as rtreeOp
dc90: 65 6e 28 29 20 6c 65 61 76 65 73 20 69 74 20 69  en() leaves it i
dca0: 6e 2e 20 2a 2f 0a 20 20 66 72 65 65 43 75 72 73  n. */.  freeCurs
dcb0: 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70 43  orConstraints(pC
dcc0: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sr);.  sqlite3_f
dcd0: 72 65 65 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74  ree(pCsr->aPoint
dce0: 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 43 73  );.  pStmt = pCs
dcf0: 72 2d 3e 70 52 65 61 64 41 75 78 3b 0a 20 20 6d  r->pReadAux;.  m
dd00: 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
dd10: 69 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73 6f  izeof(RtreeCurso
dd20: 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73  r));.  pCsr->bas
dd30: 65 2e 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  e.pVtab = (sqlit
dd40: 65 33 5f 76 74 61 62 2a 29 70 52 74 72 65 65 3b  e3_vtab*)pRtree;
dd50: 0a 20 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75  .  pCsr->pReadAu
dd60: 78 20 3d 20 70 53 74 6d 74 3b 0a 0a 20 20 70 43  x = pStmt;..  pC
dd70: 73 72 2d 3e 69 53 74 72 61 74 65 67 79 20 3d 20  sr->iStrategy = 
dd80: 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64  idxNum;.  if( id
dd90: 78 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  xNum==1 ){.    /
dda0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d  * Special case -
ddb0: 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64   lookup by rowid
ddc0: 2e 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f  . */.    RtreeNo
ddd0: 64 65 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  de *pLeaf;      
dde0: 20 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77 68 69    /* Leaf on whi
ddf0: 63 68 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ch the required 
de00: 63 65 6c 6c 20 72 65 73 69 64 65 73 20 2a 2f 0a  cell resides */.
de10: 20 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50      RtreeSearchP
de20: 6f 69 6e 74 20 2a 70 3b 20 20 20 20 20 2f 2a 20  oint *p;     /* 
de30: 53 65 61 72 63 68 20 70 6f 69 6e 74 20 66 6f 72  Search point for
de40: 20 74 68 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20   the leaf */.   
de50: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71   i64 iRowid = sq
de60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
de70: 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
de80: 69 36 34 20 69 4e 6f 64 65 20 3d 20 30 3b 0a 20  i64 iNode = 0;. 
de90: 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
dea0: 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 52 6f  Node(pRtree, iRo
deb0: 77 69 64 2c 20 26 70 4c 65 61 66 2c 20 26 69 4e  wid, &pLeaf, &iN
dec0: 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
ded0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
dee0: 4c 65 61 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf!=0 ){.     
def0: 20 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68   p = rtreeSearch
df00: 50 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52  PointNew(pCsr, R
df10: 54 52 45 45 5f 5a 45 52 4f 2c 20 30 29 3b 0a 20  TREE_ZERO, 0);. 
df20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d       assert( p!=
df30: 30 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  0 );  /* Always 
df40: 72 65 74 75 72 6e 73 20 70 43 73 72 2d 3e 73 50  returns pCsr->sP
df50: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 43  oint */.      pC
df60: 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 70  sr->aNode[0] = p
df70: 4c 65 61 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  Leaf;.      p->i
df80: 64 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20  d = iNode;.     
df90: 20 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41   p->eWithin = PA
dfa0: 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20  RTLY_WITHIN;.   
dfb0: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69     rc = nodeRowi
dfc0: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
dfd0: 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 69  Leaf, iRowid, &i
dfe0: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Cell);.      p->
dff0: 69 43 65 6c 6c 20 3d 20 28 75 38 29 69 43 65 6c  iCell = (u8)iCel
e000: 6c 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  l;.      RTREE_Q
e010: 55 45 55 45 5f 54 52 41 43 45 28 70 43 73 72 2c  UEUE_TRACE(pCsr,
e020: 20 22 50 55 53 48 2d 46 31 3a 22 29 3b 0a 20 20   "PUSH-F1:");.  
e030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e040: 43 73 72 2d 3e 61 74 45 4f 46 20 3d 20 31 3b 0a  Csr->atEOF = 1;.
e050: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
e060: 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73     /* Normal cas
e070: 65 20 2d 20 72 2d 74 72 65 65 20 73 63 61 6e 2e  e - r-tree scan.
e080: 20 53 65 74 20 75 70 20 74 68 65 20 52 74 72 65   Set up the Rtre
e090: 65 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61  eCursor.aConstra
e0a0: 69 6e 74 20 61 72 72 61 79 20 0a 20 20 20 20 2a  int array .    *
e0b0: 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e 66 69  * with the confi
e0c0: 67 75 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  gured constraint
e0d0: 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  s. .    */.    r
e0e0: 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28  c = nodeAcquire(
e0f0: 70 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70  pRtree, 1, 0, &p
e100: 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
e110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e120: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  argc>0 ){.      
e130: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
e140: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
e150: 6f 63 36 34 28 73 69 7a 65 6f 66 28 52 74 72 65  oc64(sizeof(Rtre
e160: 65 43 6f 6e 73 74 72 61 69 6e 74 29 2a 61 72 67  eConstraint)*arg
e170: 63 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  c);.      pCsr->
e180: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 61 72  nConstraint = ar
e190: 67 63 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  gc;.      if( !p
e1a0: 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Csr->aConstraint
e1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e1d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e1e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d      memset(pCsr-
e1f0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c  >aConstraint, 0,
e200: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e   sizeof(RtreeCon
e210: 73 74 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a  straint)*argc);.
e220: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
e230: 43 73 72 2d 3e 61 6e 51 75 65 75 65 2c 20 30 2c  Csr->anQueue, 0,
e240: 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 28 70 52   sizeof(u32)*(pR
e250: 74 72 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31  tree->iDepth + 1
e260: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
e270: 72 74 28 20 28 69 64 78 53 74 72 3d 3d 30 20 26  rt( (idxStr==0 &
e280: 26 20 61 72 67 63 3d 3d 30 29 0a 20 20 20 20 20  & argc==0).     
e290: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e2a0: 64 78 53 74 72 20 26 26 20 28 69 6e 74 29 73 74  dxStr && (int)st
e2b0: 72 6c 65 6e 28 69 64 78 53 74 72 29 3d 3d 61 72  rlen(idxStr)==ar
e2c0: 67 63 2a 32 29 20 29 3b 0a 20 20 20 20 20 20 20  gc*2) );.       
e2d0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 61 72   for(ii=0; ii<ar
e2e0: 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  gc; ii++){.     
e2f0: 20 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72       RtreeConstr
e300: 61 69 6e 74 20 2a 70 20 3d 20 26 70 43 73 72 2d  aint *p = &pCsr-
e310: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d  >aConstraint[ii]
e320: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f  ;.          p->o
e330: 70 20 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 5d  p = idxStr[ii*2]
e340: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  ;.          p->i
e350: 43 6f 6f 72 64 20 3d 20 69 64 78 53 74 72 5b 69  Coord = idxStr[i
e360: 69 2a 32 2b 31 5d 2d 27 30 27 3b 0a 20 20 20 20  i*2+1]-'0';.    
e370: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3e        if( p->op>
e380: 3d 52 54 52 45 45 5f 4d 41 54 43 48 20 29 7b 0a  =RTREE_MATCH ){.
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e3a0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
e3b0: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d   The right-hand-
e3c0: 73 69 64 65 20 6d 75 73 74 20 62 65 20 61 20 62  side must be a b
e3d0: 6c 6f 62 20 74 68 61 74 0a 20 20 20 20 20 20 20  lob that.       
e3e0: 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63       ** can be c
e3f0: 61 73 74 20 69 6e 74 6f 20 61 6e 20 52 74 72 65  ast into an Rtre
e400: 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74  eMatchArg object
e410: 2e 20 4f 6e 65 20 63 72 65 61 74 65 64 20 75 73  . One created us
e420: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
e430: 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 74  ** an sqlite3_rt
e440: 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
e450: 6c 62 61 63 6b 28 29 20 53 51 4c 20 75 73 65 72  lback() SQL user
e460: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
e470: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e480: 20 20 20 20 20 20 72 63 20 3d 20 64 65 73 65 72        rc = deser
e490: 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28 61  ializeGeometry(a
e4a0: 72 67 76 5b 69 69 5d 2c 20 70 29 3b 0a 20 20 20  rgv[ii], p);.   
e4b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
e4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e4e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
e500: 70 49 6e 66 6f 2d 3e 6e 43 6f 6f 72 64 20 3d 20  pInfo->nCoord = 
e510: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3b 0a 20  pRtree->nDim2;. 
e520: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49             p->pI
e530: 6e 66 6f 2d 3e 61 6e 51 75 65 75 65 20 3d 20 70  nfo->anQueue = p
e540: 43 73 72 2d 3e 61 6e 51 75 65 75 65 3b 0a 20 20  Csr->anQueue;.  
e550: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49 6e            p->pIn
e560: 66 6f 2d 3e 6d 78 4c 65 76 65 6c 20 3d 20 70 52  fo->mxLevel = pR
e570: 74 72 65 65 2d 3e 69 44 65 70 74 68 20 2b 20 31  tree->iDepth + 1
e580: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e590: 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
e5a0: 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
e5c0: 2e 72 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65  .rValue = sqlite
e5d0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
e5e0: 67 76 5b 69 69 5d 29 3b 0a 23 65 6c 73 65 0a 20  gv[ii]);.#else. 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
e600: 72 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  rValue = sqlite3
e610: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
e620: 67 76 5b 69 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  gv[ii]);.#endif.
e630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e640: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e650: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
e660: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e670: 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f     RtreeSearchPo
e680: 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  int *pNew;.     
e690: 20 70 4e 65 77 20 3d 20 72 74 72 65 65 53 65 61   pNew = rtreeSea
e6a0: 72 63 68 50 6f 69 6e 74 4e 65 77 28 70 43 73 72  rchPointNew(pCsr
e6b0: 2c 20 52 54 52 45 45 5f 5a 45 52 4f 2c 20 28 75  , RTREE_ZERO, (u
e6c0: 38 29 28 70 52 74 72 65 65 2d 3e 69 44 65 70 74  8)(pRtree->iDept
e6d0: 68 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  h+1));.      if(
e6e0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
e6f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e700: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d        pNew->id =
e710: 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
e720: 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  iCell = 0;.     
e730: 20 70 4e 65 77 2d 3e 65 57 69 74 68 69 6e 20 3d   pNew->eWithin =
e740: 20 50 41 52 54 4c 59 5f 57 49 54 48 49 4e 3b 0a   PARTLY_WITHIN;.
e750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
e760: 73 72 2d 3e 62 50 6f 69 6e 74 3d 3d 31 20 29 3b  sr->bPoint==1 );
e770: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 4e 6f  .      pCsr->aNo
e780: 64 65 5b 30 5d 20 3d 20 70 52 6f 6f 74 3b 0a 20  de[0] = pRoot;. 
e790: 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 30 3b 0a       pRoot = 0;.
e7a0: 20 20 20 20 20 20 52 54 52 45 45 5f 51 55 45 55        RTREE_QUEU
e7b0: 45 5f 54 52 41 43 45 28 70 43 73 72 2c 20 22 50  E_TRACE(pCsr, "P
e7c0: 55 53 48 2d 46 6d 3a 22 29 3b 0a 20 20 20 20 20  USH-Fm:");.     
e7d0: 20 72 63 20 3d 20 72 74 72 65 65 53 74 65 70 54   rc = rtreeStepT
e7e0: 6f 4c 65 61 66 28 70 43 73 72 29 3b 0a 20 20 20  oLeaf(pCsr);.   
e7f0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 6f 64 65 52 65   }.  }..  nodeRe
e800: 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52  lease(pRtree, pR
e810: 6f 6f 74 29 3b 0a 20 20 72 74 72 65 65 52 65 6c  oot);.  rtreeRel
e820: 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20  ease(pRtree);.  
e830: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e840: 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61  .** Rtree virtua
e850: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
e860: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
e870: 2e 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  . There are thre
e880: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e 20  e.** table scan 
e890: 73 74 72 61 74 65 67 69 65 73 20 74 6f 20 63 68  strategies to ch
e8a0: 6f 6f 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f 72  oose from (in or
e8b0: 64 65 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f  der from most to
e8c0: 20 0a 2a 2a 20 6c 65 61 73 74 20 64 65 73 69 72   .** least desir
e8d0: 61 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  able):.**.**   i
e8e0: 64 78 4e 75 6d 20 20 20 20 20 69 64 78 53 74 72  dxNum     idxStr
e8f0: 20 20 20 20 20 20 20 20 53 74 72 61 74 65 67 79          Strategy
e900: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e930: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31 20  ------.**     1 
e940: 20 20 20 20 20 20 20 55 6e 75 73 65 64 20 20 20         Unused   
e950: 20 20 20 20 20 44 69 72 65 63 74 20 6c 6f 6f 6b       Direct look
e960: 75 70 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a 20  up by rowid..** 
e970: 20 20 20 20 32 20 20 20 20 20 20 20 20 53 65 65      2        See
e980: 20 62 65 6c 6f 77 20 20 20 20 20 52 2d 74 72 65   below     R-tre
e990: 65 20 71 75 65 72 79 20 6f 72 20 66 75 6c 6c 2d  e query or full-
e9a0: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2a 20 20  table scan..**  
e9b0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
e9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9e0: 2d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 74 72 61 74  -.**.** If strat
e9f0: 65 67 79 20 31 20 69 73 20 75 73 65 64 2c 20 74  egy 1 is used, t
ea00: 68 65 6e 20 69 64 78 53 74 72 20 69 73 20 6e 6f  hen idxStr is no
ea10: 74 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 20 49 66  t meaningful. If
ea20: 20 73 74 72 61 74 65 67 79 0a 2a 2a 20 32 20 69   strategy.** 2 i
ea30: 73 20 75 73 65 64 2c 20 69 64 78 53 74 72 20 69  s used, idxStr i
ea40: 73 20 66 6f 72 6d 61 74 74 65 64 20 74 6f 20 63  s formatted to c
ea50: 6f 6e 74 61 69 6e 20 32 20 62 79 74 65 73 20 66  ontain 2 bytes f
ea60: 6f 72 20 65 61 63 68 20 0a 2a 2a 20 63 6f 6e 73  or each .** cons
ea70: 74 72 61 69 6e 74 20 75 73 65 64 2e 20 54 68 65  traint used. The
ea80: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
ea90: 20 6f 66 20 69 64 78 53 74 72 20 63 6f 72 72 65   of idxStr corre
eaa0: 73 70 6f 6e 64 20 74 6f 20 0a 2a 2a 20 74 68 65  spond to .** the
eab0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 73   constraint in s
eac0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ead0: 6f 2e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  o.aConstraintUsa
eae0: 67 65 5b 5d 20 77 69 74 68 0a 2a 2a 20 28 61 72  ge[] with.** (ar
eaf0: 67 76 49 6e 64 65 78 3d 3d 31 29 20 65 74 63 2e  gvIndex==1) etc.
eb00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
eb10: 20 6f 66 20 65 61 63 68 20 70 61 69 72 20 6f 66   of each pair of
eb20: 20 62 79 74 65 73 20 69 6e 20 69 64 78 53 74 72   bytes in idxStr
eb30: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
eb40: 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 6f 70  constraint.** op
eb50: 65 72 61 74 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  erator as follow
eb60: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 65 72 61  s:.**.**   Opera
eb70: 74 6f 72 20 20 20 20 42 79 74 65 20 56 61 6c 75  tor    Byte Valu
eb80: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
eba0: 20 20 20 20 20 20 3d 20 20 20 20 20 20 20 20 30        =        0
ebb0: 78 34 31 20 28 27 41 27 29 0a 2a 2a 20 20 20 20  x41 ('A').**    
ebc0: 20 3c 3d 20 20 20 20 20 20 20 20 30 78 34 32 20   <=        0x42 
ebd0: 28 27 42 27 29 0a 2a 2a 20 20 20 20 20 20 3c 20  ('B').**      < 
ebe0: 20 20 20 20 20 20 20 30 78 34 33 20 28 27 43 27         0x43 ('C'
ebf0: 29 0a 2a 2a 20 20 20 20 20 3e 3d 20 20 20 20 20  ).**     >=     
ec00: 20 20 20 30 78 34 34 20 28 27 44 27 29 0a 2a 2a     0x44 ('D').**
ec10: 20 20 20 20 20 20 3e 20 20 20 20 20 20 20 20 30        >        0
ec20: 78 34 35 20 28 27 45 27 29 0a 2a 2a 20 20 20 4d  x45 ('E').**   M
ec30: 41 54 43 48 20 20 20 20 20 20 20 30 78 34 36 20  ATCH       0x46 
ec40: 28 27 46 27 29 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ('F').**   -----
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  -.**.** The seco
ec70: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 69 72 20  nd of each pair 
ec80: 6f 66 20 62 79 74 65 73 20 69 64 65 6e 74 69 66  of bytes identif
ec90: 69 65 73 20 74 68 65 20 63 6f 6f 72 64 69 6e 61  ies the coordina
eca0: 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  te column.** to 
ecb0: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 73 74 72  which the constr
ecc0: 61 69 6e 74 20 61 70 70 6c 69 65 73 2e 20 54 68  aint applies. Th
ecd0: 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6f 72 64  e leftmost coord
ece0: 69 6e 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  inate column.** 
ecf0: 69 73 20 27 61 27 2c 20 74 68 65 20 73 65 63 6f  is 'a', the seco
ed00: 6e 64 20 66 72 6f 6d 20 74 68 65 20 6c 65 66 74  nd from the left
ed10: 20 27 62 27 20 65 74 63 2e 0a 2a 2f 0a 73 74 61   'b' etc..*/.sta
ed20: 74 69 63 20 69 6e 74 20 72 74 72 65 65 42 65 73  tic int rtreeBes
ed30: 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76  tIndex(sqlite3_v
ed40: 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65  tab *tab, sqlite
ed50: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
ed60: 64 78 49 6e 66 6f 29 7b 0a 20 20 52 74 72 65 65  dxInfo){.  Rtree
ed70: 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65   *pRtree = (Rtre
ed80: 65 2a 29 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  e*)tab;.  int rc
ed90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
eda0: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 62 4d  int ii;.  int bM
edb0: 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20 20  atch = 0;       
edc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
edd0: 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
ede0: 73 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72  s a MATCH constr
edf0: 61 69 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 52  aint */.  i64 nR
ee00: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
ee10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
ee20: 69 6d 61 74 65 64 20 72 6f 77 73 20 72 65 74 75  imated rows retu
ee30: 72 6e 65 64 20 62 79 20 74 68 69 73 20 73 63 61  rned by this sca
ee40: 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 49 64 78  n */..  int iIdx
ee50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 49 64   = 0;.  char zId
ee60: 78 53 74 72 5b 52 54 52 45 45 5f 4d 41 58 5f 44  xStr[RTREE_MAX_D
ee70: 49 4d 45 4e 53 49 4f 4e 53 2a 38 2b 31 5d 3b 0a  IMENSIONS*8+1];.
ee80: 20 20 6d 65 6d 73 65 74 28 7a 49 64 78 53 74 72    memset(zIdxStr
ee90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 7a 49 64 78  , 0, sizeof(zIdx
eea0: 53 74 72 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  Str));..  /* Che
eeb0: 63 6b 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ck if there exis
eec0: 74 73 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74  ts a MATCH const
eed0: 72 61 69 6e 74 20 2d 20 65 76 65 6e 20 61 6e 20  raint - even an 
eee0: 75 6e 75 73 61 62 6c 65 20 6f 6e 65 2e 20 49 66  unusable one. If
eef0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 2c 20   there.  ** is, 
ef00: 64 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20  do not consider 
ef10: 74 68 65 20 6c 6f 6f 6b 75 70 2d 62 79 2d 72 6f  the lookup-by-ro
ef20: 77 69 64 20 70 6c 61 6e 20 61 73 20 75 73 69 6e  wid plan as usin
ef30: 67 20 73 75 63 68 20 61 20 70 6c 61 6e 20 77 6f  g such a plan wo
ef40: 75 6c 64 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  uld.  ** require
ef50: 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 76 61   the VDBE to eva
ef60: 6c 75 61 74 65 20 74 68 65 20 4d 41 54 43 48 20  luate the MATCH 
ef70: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 77 68 69 63  constraint, whic
ef80: 68 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  h is not current
ef90: 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  ly.  ** possible
efa0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  . */.  for(ii=0;
efb0: 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43   ii<pIdxInfo->nC
efc0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29  onstraint; ii++)
efd0: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  {.    if( pIdxIn
efe0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
eff0: 69 69 5d 2e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  ii].op==SQLITE_I
f000: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
f010: 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 62  MATCH ){.      b
f020: 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Match = 1;.    }
f030: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
f040: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
f050: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d  ==0 );.  for(ii=
f060: 30 3b 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  0; ii<pIdxInfo->
f070: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 69  nConstraint && i
f080: 49 64 78 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  Idx<(int)(sizeof
f090: 28 7a 49 64 78 53 74 72 29 2d 31 29 3b 20 69 69  (zIdxStr)-1); ii
f0a0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
f0b0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
f0c0: 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70  nstraint *p = &p
f0d0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
f0e0: 61 69 6e 74 5b 69 69 5d 3b 0a 0a 20 20 20 20 69  aint[ii];..    i
f0f0: 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 26 26 20  f( bMatch==0 && 
f100: 70 2d 3e 75 73 61 62 6c 65 20 0a 20 20 20 20 20  p->usable .     
f110: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  && p->iColumn==0
f120: 20 26 26 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54   && p->op==SQLIT
f130: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
f140: 4e 54 5f 45 51 20 0a 20 20 20 20 29 7b 0a 20 20  NT_EQ .    ){.  
f150: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
f160: 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
f170: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
f180: 69 64 2e 20 55 73 65 20 73 74 72 61 74 65 67 79  id. Use strategy
f190: 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   1. */.      int
f1a0: 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a   jj;.      for(j
f1b0: 6a 3d 30 3b 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b  j=0; jj<ii; jj++
f1c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49  ){.        pIdxI
f1d0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
f1e0: 55 73 61 67 65 5b 6a 6a 5d 2e 61 72 67 76 49 6e  Usage[jj].argvIn
f1f0: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
f200: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
f210: 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e  traintUsage[jj].
f220: 6f 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  omit = 0;.      
f230: 7d 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  }.      pIdxInfo
f240: 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20  ->idxNum = 1;.  
f250: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
f260: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
f270: 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  i].argvIndex = 1
f280: 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
f290: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f2a0: 67 65 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b  ge[jj].omit = 1;
f2b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
f2c0: 73 74 72 61 74 65 67 79 20 69 6e 76 6f 6c 76 65  strategy involve
f2d0: 73 20 61 20 74 77 6f 20 72 6f 77 69 64 20 6c 6f  s a two rowid lo
f2e0: 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 42 2d 54 72  okups on an B-Tr
f2f0: 65 65 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ee structures.  
f300: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 6e 20      ** and then 
f310: 61 20 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20  a linear search 
f320: 6f 66 20 61 6e 20 52 2d 54 72 65 65 20 6e 6f 64  of an R-Tree nod
f330: 65 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  e. This should b
f340: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  e .      ** cons
f350: 69 64 65 72 65 64 20 61 6c 6d 6f 73 74 20 61 73  idered almost as
f360: 20 71 75 69 63 6b 20 61 73 20 61 20 64 69 72 65   quick as a dire
f370: 63 74 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20  ct rowid lookup 
f380: 28 66 6f 72 20 77 68 69 63 68 20 0a 20 20 20 20  (for which .    
f390: 20 20 2a 2a 20 73 71 6c 69 74 65 20 75 73 65 73    ** sqlite uses
f3a0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 63 6f 73   an internal cos
f3b0: 74 20 6f 66 20 30 2e 30 29 2e 20 49 74 20 69 73  t of 0.0). It is
f3c0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 74   expected to ret
f3d0: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  urn.      ** a s
f3e0: 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 20 20 20  ingle row..     
f3f0: 20 2a 2f 20 0a 20 20 20 20 20 20 70 49 64 78 49   */ .      pIdxI
f400: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
f410: 73 74 20 3d 20 33 30 2e 30 3b 0a 20 20 20 20 20  st = 30.0;.     
f420: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
f430: 61 74 65 64 52 6f 77 73 20 3d 20 31 3b 0a 20 20  atedRows = 1;.  
f440: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
f450: 78 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  xFlags = SQLITE_
f460: 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55  INDEX_SCAN_UNIQU
f470: 45 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E;.      return 
f480: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
f490: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61  ..    if( p->usa
f4a0: 62 6c 65 0a 20 20 20 20 26 26 20 28 28 70 2d 3e  ble.    && ((p->
f4b0: 69 43 6f 6c 75 6d 6e 3e 30 20 26 26 20 70 2d 3e  iColumn>0 && p->
f4c0: 69 43 6f 6c 75 6d 6e 3c 3d 70 52 74 72 65 65 2d  iColumn<=pRtree-
f4d0: 3e 6e 44 69 6d 32 29 0a 20 20 20 20 20 20 20 20  >nDim2).        
f4e0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  || p->op==SQLITE
f4f0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
f500: 54 5f 4d 41 54 43 48 29 0a 20 20 20 20 29 7b 0a  T_MATCH).    ){.
f510: 20 20 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20        u8 op;.   
f520: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
f530: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
f540: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
f550: 4e 53 54 52 41 49 4e 54 5f 45 51 3a 20 20 20 20  NSTRAINT_EQ:    
f560: 6f 70 20 3d 20 52 54 52 45 45 5f 45 51 3b 20 20  op = RTREE_EQ;  
f570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f580: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
f590: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
f5a0: 3a 20 20 20 20 6f 70 20 3d 20 52 54 52 45 45 5f  :    op = RTREE_
f5b0: 47 54 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  GT;    break;.  
f5c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
f5d0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
f5e0: 4e 54 5f 4c 45 3a 20 20 20 20 6f 70 20 3d 20 52  NT_LE:    op = R
f5f0: 54 52 45 45 5f 4c 45 3b 20 20 20 20 62 72 65 61  TREE_LE;    brea
f600: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
f610: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
f620: 53 54 52 41 49 4e 54 5f 4c 54 3a 20 20 20 20 6f  STRAINT_LT:    o
f630: 70 20 3d 20 52 54 52 45 45 5f 4c 54 3b 20 20 20  p = RTREE_LT;   
f640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f650: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
f660: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a  X_CONSTRAINT_GE:
f670: 20 20 20 20 6f 70 20 3d 20 52 54 52 45 45 5f 47      op = RTREE_G
f680: 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E;    break;.   
f690: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
f6a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
f6b0: 54 5f 4d 41 54 43 48 3a 20 6f 70 20 3d 20 52 54  T_MATCH: op = RT
f6c0: 52 45 45 5f 4d 41 54 43 48 3b 20 62 72 65 61 6b  REE_MATCH; break
f6d0: 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
f6e0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
f700: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f710: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f720: 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
f730: 20 20 20 20 20 20 20 7a 49 64 78 53 74 72 5b 69         zIdxStr[i
f740: 49 64 78 2b 2b 5d 20 3d 20 6f 70 3b 0a 20 20 20  Idx++] = op;.   
f750: 20 20 20 20 20 7a 49 64 78 53 74 72 5b 69 49 64       zIdxStr[iId
f760: 78 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 70 2d  x++] = (char)(p-
f770: 3e 69 43 6f 6c 75 6d 6e 20 2d 20 31 20 2b 20 27  >iColumn - 1 + '
f780: 30 27 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  0');.        pId
f790: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
f7a0: 6e 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76  ntUsage[ii].argv
f7b0: 49 6e 64 65 78 20 3d 20 28 69 49 64 78 2f 32 29  Index = (iIdx/2)
f7c0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e  ;.        pIdxIn
f7d0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
f7e0: 73 61 67 65 5b 69 69 5d 2e 6f 6d 69 74 20 3d 20  sage[ii].omit = 
f7f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
f800: 0a 20 20 7d 0a 0a 20 20 70 49 64 78 49 6e 66 6f  .  }..  pIdxInfo
f810: 2d 3e 69 64 78 4e 75 6d 20 3d 20 32 3b 0a 20 20  ->idxNum = 2;.  
f820: 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
f830: 46 72 65 65 49 64 78 53 74 72 20 3d 20 31 3b 0a  FreeIdxStr = 1;.
f840: 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
f850: 30 3d 3d 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  0==(pIdxInfo->id
f860: 78 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  xStr = sqlite3_m
f870: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 49 64  printf("%s", zId
f880: 78 53 74 72 29 29 20 29 7b 0a 20 20 20 20 72 65  xStr)) ){.    re
f890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f8a0: 4d 3b 0a 20 20 7d 0a 0a 20 20 6e 52 6f 77 20 3d  M;.  }..  nRow =
f8b0: 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77 45 73 74   pRtree->nRowEst
f8c0: 20 3e 3e 20 28 69 49 64 78 2f 32 29 3b 0a 20 20   >> (iIdx/2);.  
f8d0: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
f8e0: 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c  tedCost = (doubl
f8f0: 65 29 36 2e 30 20 2a 20 28 64 6f 75 62 6c 65 29  e)6.0 * (double)
f900: 6e 52 6f 77 3b 0a 20 20 70 49 64 78 49 6e 66 6f  nRow;.  pIdxInfo
f910: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
f920: 3d 20 6e 52 6f 77 3b 0a 0a 20 20 72 65 74 75 72  = nRow;..  retur
f930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f940: 65 74 75 72 6e 20 74 68 65 20 4e 2d 64 69 6d 65  eturn the N-dime
f950: 6e 73 69 6f 6e 61 6c 20 76 6f 6c 75 6d 6e 20 6f  nsional volumn o
f960: 66 20 74 68 65 20 63 65 6c 6c 20 73 74 6f 72 65  f the cell store
f970: 64 20 69 6e 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74  d in *p..*/.stat
f980: 69 63 20 52 74 72 65 65 44 56 61 6c 75 65 20 63  ic RtreeDValue c
f990: 65 6c 6c 41 72 65 61 28 52 74 72 65 65 20 2a 70  ellArea(Rtree *p
f9a0: 52 74 72 65 65 2c 20 52 74 72 65 65 43 65 6c 6c  Rtree, RtreeCell
f9b0: 20 2a 70 29 7b 0a 20 20 52 74 72 65 65 44 56 61   *p){.  RtreeDVa
f9c0: 6c 75 65 20 61 72 65 61 20 3d 20 28 52 74 72 65  lue area = (Rtre
f9d0: 65 44 56 61 6c 75 65 29 31 3b 0a 20 20 61 73 73  eDValue)1;.  ass
f9e0: 65 72 74 28 20 70 52 74 72 65 65 2d 3e 6e 44 69  ert( pRtree->nDi
f9f0: 6d 3e 3d 31 20 26 26 20 70 52 74 72 65 65 2d 3e  m>=1 && pRtree->
fa00: 6e 44 69 6d 3c 3d 35 20 29 3b 0a 23 69 66 6e 64  nDim<=5 );.#ifnd
fa10: 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
fa20: 49 4e 54 5f 4f 4e 4c 59 0a 20 20 69 66 28 20 70  INT_ONLY.  if( p
fa30: 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
fa40: 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52  e==RTREE_COORD_R
fa50: 45 41 4c 33 32 20 29 7b 0a 20 20 20 20 73 77 69  EAL32 ){.    swi
fa60: 74 63 68 28 20 70 52 74 72 65 65 2d 3e 6e 44 69  tch( pRtree->nDi
fa70: 6d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  m ){.      case 
fa80: 35 3a 20 20 61 72 65 61 20 20 3d 20 70 2d 3e 61  5:  area  = p->a
fa90: 43 6f 6f 72 64 5b 39 5d 2e 66 20 2d 20 70 2d 3e  Coord[9].f - p->
faa0: 61 43 6f 6f 72 64 5b 38 5d 2e 66 3b 0a 20 20 20  aCoord[8].f;.   
fab0: 20 20 20 63 61 73 65 20 34 3a 20 20 61 72 65 61     case 4:  area
fac0: 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 37 5d   *= p->aCoord[7]
fad0: 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 36  .f - p->aCoord[6
fae0: 5d 2e 66 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ].f;.      case 
faf0: 33 3a 20 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61  3:  area *= p->a
fb00: 43 6f 6f 72 64 5b 35 5d 2e 66 20 2d 20 70 2d 3e  Coord[5].f - p->
fb10: 61 43 6f 6f 72 64 5b 34 5d 2e 66 3b 0a 20 20 20  aCoord[4].f;.   
fb20: 20 20 20 63 61 73 65 20 32 3a 20 20 61 72 65 61     case 2:  area
fb30: 20 2a 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b 33 5d   *= p->aCoord[3]
fb40: 2e 66 20 2d 20 70 2d 3e 61 43 6f 6f 72 64 5b 32  .f - p->aCoord[2
fb50: 5d 2e 66 3b 0a 20 20 20 20 20 20 64 65 66 61 75  ].f;.      defau
fb60: 6c 74 3a 20 61 72 65 61 20 2a 3d 20 70 2d 3e 61  lt: area *= p->a
fb70: 43 6f 6f 72 64 5b 31 5d 2e 66 20 2d 20 70 2d 3e  Coord[1].f - p->
fb80: 61 43 6f 6f 72 64 5b 30 5d 2e 66 3b 0a 20 20 20  aCoord[0].f;.   
fb90: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
fba0: 66 0a 20 20 7b 0a 20 20 20 20 73 77 69 74 63 68  f.  {.    switch
fbb0: 28 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 20 29  ( pRtree->nDim )
fbc0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 3a 20  {.      case 5: 
fbd0: 20 61 72 65 61 20 20 3d 20 28 69 36 34 29 70 2d   area  = (i64)p-
fbe0: 3e 61 43 6f 6f 72 64 5b 39 5d 2e 69 20 2d 20 28  >aCoord[9].i - (
fbf0: 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b 38 5d  i64)p->aCoord[8]
fc00: 2e 69 3b 0a 20 20 20 20 20 20 63 61 73 65 20 34  .i;.      case 4
fc10: 3a 20 20 61 72 65 61 20 2a 3d 20 28 69 36 34 29  :  area *= (i64)
fc20: 70 2d 3e 61 43 6f 6f 72 64 5b 37 5d 2e 69 20 2d  p->aCoord[7].i -
fc30: 20 28 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b   (i64)p->aCoord[
fc40: 36 5d 2e 69 3b 0a 20 20 20 20 20 20 63 61 73 65  6].i;.      case
fc50: 20 33 3a 20 20 61 72 65 61 20 2a 3d 20 28 69 36   3:  area *= (i6
fc60: 34 29 70 2d 3e 61 43 6f 6f 72 64 5b 35 5d 2e 69  4)p->aCoord[5].i
fc70: 20 2d 20 28 69 36 34 29 70 2d 3e 61 43 6f 6f 72   - (i64)p->aCoor
fc80: 64 5b 34 5d 2e 69 3b 0a 20 20 20 20 20 20 63 61  d[4].i;.      ca
fc90: 73 65 20 32 3a 20 20 61 72 65 61 20 2a 3d 20 28  se 2:  area *= (
fca0: 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b 33 5d  i64)p->aCoord[3]
fcb0: 2e 69 20 2d 20 28 69 36 34 29 70 2d 3e 61 43 6f  .i - (i64)p->aCo
fcc0: 6f 72 64 5b 32 5d 2e 69 3b 0a 20 20 20 20 20 20  ord[2].i;.      
fcd0: 64 65 66 61 75 6c 74 3a 20 61 72 65 61 20 2a 3d  default: area *=
fce0: 20 28 69 36 34 29 70 2d 3e 61 43 6f 6f 72 64 5b   (i64)p->aCoord[
fcf0: 31 5d 2e 69 20 2d 20 28 69 36 34 29 70 2d 3e 61  1].i - (i64)p->a
fd00: 43 6f 6f 72 64 5b 30 5d 2e 69 3b 0a 20 20 20 20  Coord[0].i;.    
fd10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
fd20: 72 65 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rea;.}../*.** Re
fd30: 74 75 72 6e 20 74 68 65 20 6d 61 72 67 69 6e 20  turn the margin 
fd40: 6c 65 6e 67 74 68 20 6f 66 20 63 65 6c 6c 20 70  length of cell p
fd50: 2e 20 54 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e  . The margin len
fd60: 67 74 68 20 69 73 20 74 68 65 20 73 75 6d 0a 2a  gth is the sum.*
fd70: 2a 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 73  * of the objects
fd80: 20 73 69 7a 65 20 69 6e 20 65 61 63 68 20 64 69   size in each di
fd90: 6d 65 6e 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  mension..*/.stat
fda0: 69 63 20 52 74 72 65 65 44 56 61 6c 75 65 20 63  ic RtreeDValue c
fdb0: 65 6c 6c 4d 61 72 67 69 6e 28 52 74 72 65 65 20  ellMargin(Rtree 
fdc0: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 43 65  *pRtree, RtreeCe
fdd0: 6c 6c 20 2a 70 29 7b 0a 20 20 52 74 72 65 65 44  ll *p){.  RtreeD
fde0: 56 61 6c 75 65 20 6d 61 72 67 69 6e 20 3d 20 30  Value margin = 0
fdf0: 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 70 52 74  ;.  int ii = pRt
fe00: 72 65 65 2d 3e 6e 44 69 6d 32 20 2d 20 32 3b 0a  ree->nDim2 - 2;.
fe10: 20 20 64 6f 7b 0a 20 20 20 20 6d 61 72 67 69 6e    do{.    margin
fe20: 20 2b 3d 20 28 44 43 4f 4f 52 44 28 70 2d 3e 61   += (DCOORD(p->a
fe30: 43 6f 6f 72 64 5b 69 69 2b 31 5d 29 20 2d 20 44  Coord[ii+1]) - D
fe40: 43 4f 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b  COORD(p->aCoord[
fe50: 69 69 5d 29 29 3b 0a 20 20 20 20 69 69 20 2d 3d  ii]));.    ii -=
fe60: 20 32 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 69   2;.  }while( ii
fe70: 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
fe80: 6d 61 72 67 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  margin;.}../*.**
fe90: 20 53 74 6f 72 65 20 74 68 65 20 75 6e 69 6f 6e   Store the union
fea0: 20 6f 66 20 63 65 6c 6c 73 20 70 31 20 61 6e 64   of cells p1 and
feb0: 20 70 32 20 69 6e 20 70 31 2e 0a 2a 2f 0a 73 74   p2 in p1..*/.st
fec0: 61 74 69 63 20 76 6f 69 64 20 63 65 6c 6c 55 6e  atic void cellUn
fed0: 69 6f 6e 28 52 74 72 65 65 20 2a 70 52 74 72 65  ion(Rtree *pRtre
fee0: 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 31  e, RtreeCell *p1
fef0: 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 32 29  , RtreeCell *p2)
ff00: 7b 0a 20 20 69 6e 74 20 69 69 20 3d 20 30 3b 0a  {.  int ii = 0;.
ff10: 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e 65 43    if( pRtree->eC
ff20: 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f  oordType==RTREE_
ff30: 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29 7b 0a  COORD_REAL32 ){.
ff40: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 70 31      do{.      p1
ff50: 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d  ->aCoord[ii].f =
ff60: 20 4d 49 4e 28 70 31 2d 3e 61 43 6f 6f 72 64 5b   MIN(p1->aCoord[
ff70: 69 69 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72  ii].f, p2->aCoor
ff80: 64 5b 69 69 5d 2e 66 29 3b 0a 20 20 20 20 20 20  d[ii].f);.      
ff90: 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d  p1->aCoord[ii+1]
ffa0: 2e 66 20 3d 20 4d 41 58 28 70 31 2d 3e 61 43 6f  .f = MAX(p1->aCo
ffb0: 6f 72 64 5b 69 69 2b 31 5d 2e 66 2c 20 70 32 2d  ord[ii+1].f, p2-
ffc0: 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 29  >aCoord[ii+1].f)
ffd0: 3b 0a 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b  ;.      ii += 2;
ffe0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 69 3c  .    }while( ii<
fff0: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 29 3b  pRtree->nDim2 );
10000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
10010 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f  {.      p1->aCoo
10020 72 64 5b 69 69 5d 2e 69 20 3d 20 4d 49 4e 28 70  rd[ii].i = MIN(p
10030 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 2c  1->aCoord[ii].i,
10040 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e   p2->aCoord[ii].
10050 69 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43  i);.      p1->aC
10060 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 20 3d 20 4d  oord[ii+1].i = M
10070 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  AX(p1->aCoord[ii
10080 2b 31 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f 6f 72  +1].i, p2->aCoor
10090 64 5b 69 69 2b 31 5d 2e 69 29 3b 0a 20 20 20 20  d[ii+1].i);.    
100a0 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 7d    ii += 2;.    }
100b0 77 68 69 6c 65 28 20 69 69 3c 70 52 74 72 65 65  while( ii<pRtree
100c0 2d 3e 6e 44 69 6d 32 20 29 3b 0a 20 20 7d 0a 7d  ->nDim2 );.  }.}
100d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
100e0 72 75 65 20 69 66 20 74 68 65 20 61 72 65 61 20  rue if the area 
100f0 63 6f 76 65 72 65 64 20 62 79 20 70 32 20 69 73  covered by p2 is
10100 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
10110 20 61 72 65 61 20 63 6f 76 65 72 65 64 0a 2a 2a   area covered.**
10120 20 62 79 20 70 31 2e 20 46 61 6c 73 65 20 6f 74   by p1. False ot
10130 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
10140 69 63 20 69 6e 74 20 63 65 6c 6c 43 6f 6e 74 61  ic int cellConta
10150 69 6e 73 28 52 74 72 65 65 20 2a 70 52 74 72 65  ins(Rtree *pRtre
10160 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 31  e, RtreeCell *p1
10170 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 32 29  , RtreeCell *p2)
10180 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
10190 74 20 69 73 49 6e 74 20 3d 20 28 70 52 74 72 65  t isInt = (pRtre
101a0 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52  e->eCoordType==R
101b0 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
101c0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  );.  for(ii=0; i
101d0 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3b  i<pRtree->nDim2;
101e0 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 52 74 72   ii+=2){.    Rtr
101f0 65 65 43 6f 6f 72 64 20 2a 61 31 20 3d 20 26 70  eeCoord *a1 = &p
10200 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a 20  1->aCoord[ii];. 
10210 20 20 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61     RtreeCoord *a
10220 32 20 3d 20 26 70 32 2d 3e 61 43 6f 6f 72 64 5b  2 = &p2->aCoord[
10230 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 21 69  ii];.    if( (!i
10240 73 49 6e 74 20 26 26 20 28 61 32 5b 30 5d 2e 66  sInt && (a2[0].f
10250 3c 61 31 5b 30 5d 2e 66 20 7c 7c 20 61 32 5b 31  <a1[0].f || a2[1
10260 5d 2e 66 3e 61 31 5b 31 5d 2e 66 29 29 20 0a 20  ].f>a1[1].f)) . 
10270 20 20 20 20 7c 7c 20 28 20 69 73 49 6e 74 20 26      || ( isInt &
10280 26 20 28 61 32 5b 30 5d 2e 69 3c 61 31 5b 30 5d  & (a2[0].i<a1[0]
10290 2e 69 20 7c 7c 20 61 32 5b 31 5d 2e 69 3e 61 31  .i || a2[1].i>a1
102a0 5b 31 5d 2e 69 29 29 20 0a 20 20 20 20 29 7b 0a  [1].i)) .    ){.
102b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
102c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
102d0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
102e0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
102f0 20 63 65 6c 6c 20 70 20 77 6f 75 6c 64 20 67 72   cell p would gr
10300 6f 77 20 62 79 20 69 66 20 69 74 20 77 65 72 65  ow by if it were
10310 20 75 6e 69 6f 6e 65 64 20 77 69 74 68 20 70 43   unioned with pC
10320 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ell..*/.static R
10330 74 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 47  treeDValue cellG
10340 72 6f 77 74 68 28 52 74 72 65 65 20 2a 70 52 74  rowth(Rtree *pRt
10350 72 65 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a  ree, RtreeCell *
10360 70 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  p, RtreeCell *pC
10370 65 6c 6c 29 7b 0a 20 20 52 74 72 65 65 44 56 61  ell){.  RtreeDVa
10380 6c 75 65 20 61 72 65 61 3b 0a 20 20 52 74 72 65  lue area;.  Rtre
10390 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 6d 65  eCell cell;.  me
103a0 6d 63 70 79 28 26 63 65 6c 6c 2c 20 70 2c 20 73  mcpy(&cell, p, s
103b0 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
103c0 29 3b 0a 20 20 61 72 65 61 20 3d 20 63 65 6c 6c  );.  area = cell
103d0 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 63 65  Area(pRtree, &ce
103e0 6c 6c 29 3b 0a 20 20 63 65 6c 6c 55 6e 69 6f 6e  ll);.  cellUnion
103f0 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20  (pRtree, &cell, 
10400 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
10410 20 28 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65   (cellArea(pRtre
10420 65 2c 20 26 63 65 6c 6c 29 2d 61 72 65 61 29 3b  e, &cell)-area);
10430 0a 7d 0a 0a 73 74 61 74 69 63 20 52 74 72 65 65  .}..static Rtree
10440 44 56 61 6c 75 65 20 63 65 6c 6c 4f 76 65 72 6c  DValue cellOverl
10450 61 70 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ap(.  Rtree *pRt
10460 72 65 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c  ree, .  RtreeCel
10470 6c 20 2a 70 2c 20 0a 20 20 52 74 72 65 65 43 65  l *p, .  RtreeCe
10480 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e  ll *aCell, .  in
10490 74 20 6e 43 65 6c 6c 0a 29 7b 0a 20 20 69 6e 74  t nCell.){.  int
104a0 20 69 69 3b 0a 20 20 52 74 72 65 65 44 56 61 6c   ii;.  RtreeDVal
104b0 75 65 20 6f 76 65 72 6c 61 70 20 3d 20 52 54 52  ue overlap = RTR
104c0 45 45 5f 5a 45 52 4f 3b 0a 20 20 66 6f 72 28 69  EE_ZERO;.  for(i
104d0 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69  i=0; ii<nCell; i
104e0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a  i++){.    int jj
104f0 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75  ;.    RtreeDValu
10500 65 20 6f 20 3d 20 28 52 74 72 65 65 44 56 61 6c  e o = (RtreeDVal
10510 75 65 29 31 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  ue)1;.    for(jj
10520 3d 30 3b 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e  =0; jj<pRtree->n
10530 44 69 6d 32 3b 20 6a 6a 2b 3d 32 29 7b 0a 20 20  Dim2; jj+=2){.  
10540 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
10550 78 31 2c 20 78 32 3b 0a 20 20 20 20 20 20 78 31  x1, x2;.      x1
10560 20 3d 20 4d 41 58 28 44 43 4f 4f 52 44 28 70 2d   = MAX(DCOORD(p-
10570 3e 61 43 6f 6f 72 64 5b 6a 6a 5d 29 2c 20 44 43  >aCoord[jj]), DC
10580 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61  OORD(aCell[ii].a
10590 43 6f 6f 72 64 5b 6a 6a 5d 29 29 3b 0a 20 20 20  Coord[jj]));.   
105a0 20 20 20 78 32 20 3d 20 4d 49 4e 28 44 43 4f 4f     x2 = MIN(DCOO
105b0 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a 2b  RD(p->aCoord[jj+
105c0 31 5d 29 2c 20 44 43 4f 4f 52 44 28 61 43 65 6c  1]), DCOORD(aCel
105d0 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 6a 6a 2b  l[ii].aCoord[jj+
105e0 31 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1]));.      if( 
105f0 78 32 3c 78 31 20 29 7b 0a 20 20 20 20 20 20 20  x2<x1 ){.       
10600 20 6f 20 3d 20 28 52 74 72 65 65 44 56 61 6c 75   o = (RtreeDValu
10610 65 29 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e)0;.        bre
10620 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
10630 0a 20 20 20 20 20 20 20 20 6f 20 3d 20 6f 20 2a  .        o = o *
10640 20 28 78 32 2d 78 31 29 3b 0a 20 20 20 20 20 20   (x2-x1);.      
10650 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 76 65 72  }.    }.    over
10660 6c 61 70 20 2b 3d 20 6f 3b 0a 20 20 7d 0a 20 20  lap += o;.  }.  
10670 72 65 74 75 72 6e 20 6f 76 65 72 6c 61 70 3b 0a  return overlap;.
10680 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
10690 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
106a0 74 73 20 74 68 65 20 43 68 6f 6f 73 65 4c 65 61  ts the ChooseLea
106b0 66 20 61 6c 67 6f 72 69 74 68 6d 20 66 72 6f 6d  f algorithm from
106c0 20 47 75 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2a 20   Gutman[84]..** 
106d0 43 68 6f 6f 73 65 53 75 62 54 72 65 65 20 69 6e  ChooseSubTree in
106e0 20 72 2a 74 72 65 65 20 74 65 72 6d 69 6e 6f 6c   r*tree terminol
106f0 6f 67 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ogy..*/.static i
10700 6e 74 20 43 68 6f 6f 73 65 4c 65 61 66 28 0a 20  nt ChooseLeaf(. 
10710 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20   Rtree *pRtree, 
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10730 20 52 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a   Rtree table */.
10740 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65    RtreeCell *pCe
10750 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll,            /
10760 2a 20 43 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  * Cell to insert
10770 20 69 6e 74 6f 20 72 74 72 65 65 20 2a 2f 0a 20   into rtree */. 
10780 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 20 20   int iHeight,   
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107a0 20 48 65 69 67 68 74 20 6f 66 20 73 75 62 2d 74   Height of sub-t
107b0 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70 43  ree rooted at pC
107c0 65 6c 6c 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f  ell */.  RtreeNo
107d0 64 65 20 2a 2a 70 70 4c 65 61 66 20 20 20 20 20  de **ppLeaf     
107e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
107f0 6c 65 63 74 65 64 20 6c 65 61 66 20 70 61 67 65  lected leaf page
10800 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10810 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 52 74 72  .  int ii;.  Rtr
10820 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  eeNode *pNode = 
10830 30 3b 0a 20 20 72 63 20 3d 20 6e 6f 64 65 41 63  0;.  rc = nodeAc
10840 71 75 69 72 65 28 70 52 74 72 65 65 2c 20 31 2c  quire(pRtree, 1,
10850 20 30 2c 20 26 70 4e 6f 64 65 29 3b 0a 0a 20 20   0, &pNode);..  
10860 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
10870 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28 70  LITE_OK && ii<(p
10880 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 69 48  Rtree->iDepth-iH
10890 65 69 67 68 74 29 3b 20 69 69 2b 2b 29 7b 0a 20  eight); ii++){. 
108a0 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20     int iCell;.  
108b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
108c0 69 42 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  iBest = 0;..    
108d0 52 74 72 65 65 44 56 61 6c 75 65 20 66 4d 69 6e  RtreeDValue fMin
108e0 47 72 6f 77 74 68 20 3d 20 52 54 52 45 45 5f 5a  Growth = RTREE_Z
108f0 45 52 4f 3b 0a 20 20 20 20 52 74 72 65 65 44 56  ERO;.    RtreeDV
10900 61 6c 75 65 20 66 4d 69 6e 41 72 65 61 20 3d 20  alue fMinArea = 
10910 52 54 52 45 45 5f 5a 45 52 4f 3b 0a 0a 20 20 20  RTREE_ZERO;..   
10920 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45   int nCell = NCE
10930 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52  LL(pNode);.    R
10940 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20  treeCell cell;. 
10950 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43     RtreeNode *pC
10960 68 69 6c 64 3b 0a 0a 20 20 20 20 52 74 72 65 65  hild;..    Rtree
10970 43 65 6c 6c 20 2a 61 43 65 6c 6c 20 3d 20 30 3b  Cell *aCell = 0;
10980 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
10990 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 77  the child node w
109a0 68 69 63 68 20 77 69 6c 6c 20 62 65 20 65 6e 6c  hich will be enl
109b0 61 72 67 65 64 20 74 68 65 20 6c 65 61 73 74 20  arged the least 
109c0 69 66 20 70 43 65 6c 6c 0a 20 20 20 20 2a 2a 20  if pCell.    ** 
109d0 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  is inserted into
109e0 20 69 74 2e 20 52 65 73 6f 6c 76 65 20 74 69 65   it. Resolve tie
109f0 73 20 62 79 20 63 68 6f 6f 73 69 6e 67 20 74 68  s by choosing th
10a00 65 20 65 6e 74 72 79 20 77 69 74 68 0a 20 20 20  e entry with.   
10a10 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   ** the smallest
10a20 20 61 72 65 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   area..    */.  
10a30 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30 3b 20 69    for(iCell=0; i
10a40 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 69 43 65 6c  Cell<nCell; iCel
10a50 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
10a60 62 42 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  bBest = 0;.     
10a70 20 52 74 72 65 65 44 56 61 6c 75 65 20 67 72 6f   RtreeDValue gro
10a80 77 74 68 3b 0a 20 20 20 20 20 20 52 74 72 65 65  wth;.      Rtree
10a90 44 56 61 6c 75 65 20 61 72 65 61 3b 0a 20 20 20  DValue area;.   
10aa0 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
10ab0 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 43  Rtree, pNode, iC
10ac0 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 20  ell, &cell);.   
10ad0 20 20 20 67 72 6f 77 74 68 20 3d 20 63 65 6c 6c     growth = cell
10ae0 47 72 6f 77 74 68 28 70 52 74 72 65 65 2c 20 26  Growth(pRtree, &
10af0 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  cell, pCell);.  
10b00 20 20 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41      area = cellA
10b10 72 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c  rea(pRtree, &cel
10b20 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  l);.      if( iC
10b30 65 6c 6c 3d 3d 30 7c 7c 67 72 6f 77 74 68 3c 66  ell==0||growth<f
10b40 4d 69 6e 47 72 6f 77 74 68 7c 7c 28 67 72 6f 77  MinGrowth||(grow
10b50 74 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68 20 26  th==fMinGrowth &
10b60 26 20 61 72 65 61 3c 66 4d 69 6e 41 72 65 61 29  & area<fMinArea)
10b70 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 65 73   ){.        bBes
10b80 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
10b90 20 20 20 20 20 69 66 28 20 62 42 65 73 74 20 29       if( bBest )
10ba0 7b 0a 20 20 20 20 20 20 20 20 66 4d 69 6e 47 72  {.        fMinGr
10bb0 6f 77 74 68 20 3d 20 67 72 6f 77 74 68 3b 0a 20  owth = growth;. 
10bc0 20 20 20 20 20 20 20 66 4d 69 6e 41 72 65 61 20         fMinArea 
10bd0 3d 20 61 72 65 61 3b 0a 20 20 20 20 20 20 20 20  = area;.        
10be0 69 42 65 73 74 20 3d 20 63 65 6c 6c 2e 69 52 6f  iBest = cell.iRo
10bf0 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  wid;.      }.   
10c00 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
10c10 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 20  free(aCell);.   
10c20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69 72   rc = nodeAcquir
10c30 65 28 70 52 74 72 65 65 2c 20 69 42 65 73 74 2c  e(pRtree, iBest,
10c40 20 70 4e 6f 64 65 2c 20 26 70 43 68 69 6c 64 29   pNode, &pChild)
10c50 3b 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73  ;.    nodeReleas
10c60 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  e(pRtree, pNode)
10c70 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 43  ;.    pNode = pC
10c80 68 69 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  hild;.  }..  *pp
10c90 4c 65 61 66 20 3d 20 70 4e 6f 64 65 3b 0a 20 20  Leaf = pNode;.  
10ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10cb0 0a 2a 2a 20 41 20 63 65 6c 6c 20 77 69 74 68 20  .** A cell with 
10cc0 74 68 65 20 73 61 6d 65 20 63 6f 6e 74 65 6e 74  the same content
10cd0 20 61 73 20 70 43 65 6c 6c 20 68 61 73 20 6a 75   as pCell has ju
10ce0 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
10cf0 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 6e 6f 64   into.** the nod
10d00 65 20 70 4e 6f 64 65 2e 20 54 68 69 73 20 66 75  e pNode. This fu
10d10 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74  nction updates t
10d20 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20  he bounding box 
10d30 63 65 6c 6c 73 20 69 6e 0a 2a 2a 20 61 6c 6c 20  cells in.** all 
10d40 61 6e 63 65 73 74 6f 72 20 65 6c 65 6d 65 6e 74  ancestor element
10d50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10d60 20 41 64 6a 75 73 74 54 72 65 65 28 0a 20 20 52   AdjustTree(.  R
10d70 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 20 20  tree *pRtree,   
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 2f 2a 20 52 74 72 65 65 20 74 61 62 6c 65 20   /* Rtree table 
10da0 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  */.  RtreeNode *
10db0 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pNode,          
10dc0 20 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74         /* Adjust
10dd0 20 61 6e 63 65 73 74 72 79 20 6f 66 20 74 68 69   ancestry of thi
10de0 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 52 74 72  s node. */.  Rtr
10df0 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 20 20  eeCell *pCell   
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e10 2a 20 54 68 69 73 20 63 65 6c 6c 20 77 61 73 20  * This cell was 
10e20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a 2f  just inserted */
10e30 0a 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  .){.  RtreeNode 
10e40 2a 70 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 69 6e  *p = pNode;.  in
10e50 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 68 69  t cnt = 0;.  whi
10e60 6c 65 28 20 70 2d 3e 70 50 61 72 65 6e 74 20 29  le( p->pParent )
10e70 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20  {.    RtreeNode 
10e80 2a 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 50  *pParent = p->pP
10e90 61 72 65 6e 74 3b 0a 20 20 20 20 52 74 72 65 65  arent;.    Rtree
10ea0 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 69  Cell cell;.    i
10eb0 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20 69  nt iCell;..    i
10ec0 66 28 20 28 2b 2b 63 6e 74 29 3e 31 30 30 30 20  f( (++cnt)>1000 
10ed0 7c 7c 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64  || nodeParentInd
10ee0 65 78 28 70 52 74 72 65 65 2c 20 70 2c 20 26 69  ex(pRtree, p, &i
10ef0 43 65 6c 6c 29 20 20 29 7b 0a 20 20 20 20 20 20  Cell)  ){.      
10f00 52 54 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54  RTREE_IS_CORRUPT
10f10 28 70 52 74 72 65 65 29 3b 0a 20 20 20 20 20 20  (pRtree);.      
10f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10f30 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
10f40 7d 0a 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  }..    nodeGetCe
10f50 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ll(pRtree, pPare
10f60 6e 74 2c 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c  nt, iCell, &cell
10f70 29 3b 0a 20 20 20 20 69 66 28 20 21 63 65 6c 6c  );.    if( !cell
10f80 43 6f 6e 74 61 69 6e 73 28 70 52 74 72 65 65 2c  Contains(pRtree,
10f90 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 20 29   &cell, pCell) )
10fa0 7b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f  {.      cellUnio
10fb0 6e 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c  n(pRtree, &cell,
10fc0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 6e   pCell);.      n
10fd0 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c  odeOverwriteCell
10fe0 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74  (pRtree, pParent
10ff0 2c 20 26 63 65 6c 6c 2c 20 69 43 65 6c 6c 29 3b  , &cell, iCell);
11000 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 70 20 3d  .    }. .    p =
11010 20 70 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20   pParent;.  }.  
11020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
11040 20 6d 61 70 70 69 6e 67 20 28 69 52 6f 77 69 64   mapping (iRowid
11050 2d 3e 69 4e 6f 64 65 29 20 74 6f 20 74 68 65 20  ->iNode) to the 
11060 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64 20 74 61  <rtree>_rowid ta
11070 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
11080 6e 74 20 72 6f 77 69 64 57 72 69 74 65 28 52 74  nt rowidWrite(Rt
11090 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71 6c  ree *pRtree, sql
110a0 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
110b0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
110c0 20 69 4e 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74   iNode){.  sqlit
110d0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52  e3_bind_int64(pR
110e0 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
110f0 64 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  d, 1, iRowid);. 
11100 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
11110 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57 72 69  t64(pRtree->pWri
11120 74 65 52 6f 77 69 64 2c 20 32 2c 20 69 4e 6f 64  teRowid, 2, iNod
11130 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  e);.  sqlite3_st
11140 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  ep(pRtree->pWrit
11150 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72  eRowid);.  retur
11160 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
11170 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f  pRtree->pWriteRo
11180 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  wid);.}../*.** W
11190 72 69 74 65 20 6d 61 70 70 69 6e 67 20 28 69 4e  rite mapping (iN
111a0 6f 64 65 2d 3e 69 50 61 72 29 20 74 6f 20 74 68  ode->iPar) to th
111b0 65 20 3c 72 74 72 65 65 3e 5f 70 61 72 65 6e 74  e <rtree>_parent
111c0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
111d0 63 20 69 6e 74 20 70 61 72 65 6e 74 57 72 69 74  c int parentWrit
111e0 65 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  e(Rtree *pRtree,
111f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11200 4e 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Node, sqlite3_in
11210 74 36 34 20 69 50 61 72 29 7b 0a 20 20 73 71 6c  t64 iPar){.  sql
11220 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
11230 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
11240 72 65 6e 74 2c 20 31 2c 20 69 4e 6f 64 65 29 3b  rent, 1, iNode);
11250 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
11260 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70 57  int64(pRtree->pW
11270 72 69 74 65 50 61 72 65 6e 74 2c 20 32 2c 20 69  riteParent, 2, i
11280 50 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Par);.  sqlite3_
11290 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57 72  step(pRtree->pWr
112a0 69 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 72 65  iteParent);.  re
112b0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
112c0 65 74 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  et(pRtree->pWrit
112d0 65 50 61 72 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61  eParent);.}..sta
112e0 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73  tic int rtreeIns
112f0 65 72 74 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c  ertCell(Rtree *,
11300 20 52 74 72 65 65 4e 6f 64 65 20 2a 2c 20 52 74   RtreeNode *, Rt
11310 72 65 65 43 65 6c 6c 20 2a 2c 20 69 6e 74 29 3b  reeCell *, int);
11320 0a 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  .../*.** Argumen
11330 74 73 20 61 49 64 78 2c 20 61 44 69 73 74 61 6e  ts aIdx, aDistan
11340 63 65 20 61 6e 64 20 61 53 70 61 72 65 20 61 6c  ce and aSpare al
11350 6c 20 70 6f 69 6e 74 20 74 6f 20 61 72 72 61 79  l point to array
11360 73 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 6e 49 64  s of size.** nId
11370 78 2e 20 54 68 65 20 61 49 64 78 20 61 72 72 61  x. The aIdx arra
11380 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
11390 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 66  et of integers f
113a0 72 6f 6d 20 30 20 74 6f 20 0a 2a 2a 20 28 6e 49  rom 0 to .** (nI
113b0 64 78 2d 31 29 20 69 6e 20 6e 6f 20 70 61 72 74  dx-1) in no part
113c0 69 63 75 6c 61 72 20 6f 72 64 65 72 2e 20 54 68  icular order. Th
113d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 6f 72 74  is function sort
113e0 73 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  s the values.** 
113f0 69 6e 20 61 49 64 78 20 61 63 63 6f 72 64 69 6e  in aIdx accordin
11400 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 65 64  g to the indexed
11410 20 76 61 6c 75 65 73 20 69 6e 20 61 44 69 73 74   values in aDist
11420 61 6e 63 65 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  ance. For.** exa
11430 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
11440 68 65 20 69 6e 70 75 74 73 3a 0a 2a 2a 0a 2a 2a  he inputs:.**.**
11450 20 20 20 61 49 64 78 20 20 20 20 20 20 3d 20 7b     aIdx      = {
11460 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
11470 33 20 7d 0a 2a 2a 20 20 20 61 44 69 73 74 61 6e  3 }.**   aDistan
11480 63 65 20 3d 20 7b 20 35 2e 30 2c 20 32 2e 30 2c  ce = { 5.0, 2.0,
11490 20 37 2e 30 2c 20 36 2e 30 20 7d 0a 2a 2a 0a 2a   7.0, 6.0 }.**.*
114a0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
114b0 73 65 74 73 20 74 68 65 20 61 49 64 78 20 61 72  sets the aIdx ar
114c0 72 61 79 20 74 6f 20 63 6f 6e 74 61 69 6e 3a 0a  ray to contain:.
114d0 2a 2a 0a 2a 2a 20 20 20 61 49 64 78 20 20 20 20  **.**   aIdx    
114e0 20 20 3d 20 7b 20 30 2c 20 20 20 31 2c 20 20 20    = { 0,   1,   
114f0 32 2c 20 20 20 33 20 7d 0a 2a 2a 0a 2a 2a 20 54  2,   3 }.**.** T
11500 68 65 20 61 53 70 61 72 65 20 61 72 72 61 79 20  he aSpare array 
11510 69 73 20 75 73 65 64 20 61 73 20 74 65 6d 70 6f  is used as tempo
11520 72 61 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61  rary working spa
11530 63 65 20 62 79 20 74 68 65 0a 2a 2a 20 73 6f 72  ce by the.** sor
11540 74 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ting algorithm..
11550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
11560 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 0a 20  ortByDistance(. 
11570 20 69 6e 74 20 2a 61 49 64 78 2c 20 0a 20 20 69   int *aIdx, .  i
11580 6e 74 20 6e 49 64 78 2c 20 0a 20 20 52 74 72 65  nt nIdx, .  Rtre
11590 65 44 56 61 6c 75 65 20 2a 61 44 69 73 74 61 6e  eDValue *aDistan
115a0 63 65 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70 61  ce, .  int *aSpa
115b0 72 65 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64 78  re.){.  if( nIdx
115c0 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  >1 ){.    int iL
115d0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  eft = 0;.    int
115e0 20 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20   iRight = 0;..  
115f0 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e 49    int nLeft = nI
11600 64 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52  dx/2;.    int nR
11610 69 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65 66  ight = nIdx-nLef
11620 74 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65 66  t;.    int *aLef
11630 74 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69 6e  t = aIdx;.    in
11640 74 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49 64  t *aRight = &aId
11650 78 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20 53  x[nLeft];..    S
11660 6f 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 4c  ortByDistance(aL
11670 65 66 74 2c 20 6e 4c 65 66 74 2c 20 61 44 69 73  eft, nLeft, aDis
11680 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
11690 20 20 20 20 53 6f 72 74 42 79 44 69 73 74 61 6e      SortByDistan
116a0 63 65 28 61 52 69 67 68 74 2c 20 6e 52 69 67 68  ce(aRight, nRigh
116b0 74 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61 53  t, aDistance, aS
116c0 70 61 72 65 29 3b 0a 0a 20 20 20 20 6d 65 6d 63  pare);..    memc
116d0 70 79 28 61 53 70 61 72 65 2c 20 61 4c 65 66 74  py(aSpare, aLeft
116e0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4c  , sizeof(int)*nL
116f0 65 66 74 29 3b 0a 20 20 20 20 61 4c 65 66 74 20  eft);.    aLeft 
11700 3d 20 61 53 70 61 72 65 3b 0a 0a 20 20 20 20 77  = aSpare;..    w
11710 68 69 6c 65 28 20 69 4c 65 66 74 3c 6e 4c 65 66  hile( iLeft<nLef
11720 74 20 7c 7c 20 69 52 69 67 68 74 3c 6e 52 69 67  t || iRight<nRig
11730 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
11740 69 4c 65 66 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a  iLeft==nLeft ){.
11750 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
11760 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69  ft+iRight] = aRi
11770 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20  ght[iRight];.   
11780 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20       iRight++;. 
11790 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
117a0 52 69 67 68 74 3d 3d 6e 52 69 67 68 74 20 29 7b  Right==nRight ){
117b0 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c  .        aIdx[iL
117c0 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c  eft+iRight] = aL
117d0 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20  eft[iLeft];.    
117e0 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20 20      iLeft++;.   
117f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11800 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 4c    RtreeDValue fL
11810 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63 65 5b  eft = aDistance[
11820 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 3b 0a 20  aLeft[iLeft]];. 
11830 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c         RtreeDVal
11840 75 65 20 66 52 69 67 68 74 20 3d 20 61 44 69 73  ue fRight = aDis
11850 74 61 6e 63 65 5b 61 52 69 67 68 74 5b 69 52 69  tance[aRight[iRi
11860 67 68 74 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  ght]];.        i
11870 66 28 20 66 4c 65 66 74 3c 66 52 69 67 68 74 20  f( fLeft<fRight 
11880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 49 64  ){.          aId
11890 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20  x[iLeft+iRight] 
118a0 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d 3b 0a  = aLeft[iLeft];.
118b0 20 20 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b            iLeft+
118c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
118d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 49 64 78  {.          aIdx
118e0 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d 20 3d  [iLeft+iRight] =
118f0 20 61 52 69 67 68 74 5b 69 52 69 67 68 74 5d 3b   aRight[iRight];
11900 0a 20 20 20 20 20 20 20 20 20 20 69 52 69 67 68  .          iRigh
11910 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
11920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
11930 66 20 30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  f 0.    /* Check
11940 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 77   that the sort w
11950 6f 72 6b 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 20  orked */.    {. 
11960 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
11970 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
11980 6e 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  nIdx; jj++){.   
11990 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
119a0 20 6c 65 66 74 20 3d 20 61 44 69 73 74 61 6e 63   left = aDistanc
119b0 65 5b 61 49 64 78 5b 6a 6a 2d 31 5d 5d 3b 0a 20  e[aIdx[jj-1]];. 
119c0 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c         RtreeDVal
119d0 75 65 20 72 69 67 68 74 20 3d 20 61 44 69 73 74  ue right = aDist
119e0 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 5d 5d 3b 0a  ance[aIdx[jj]];.
119f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11a00 6c 65 66 74 3c 3d 72 69 67 68 74 20 29 3b 0a 20  left<=right );. 
11a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
11a20 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
11a30 20 41 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c   Arguments aIdx,
11a40 20 61 43 65 6c 6c 20 61 6e 64 20 61 53 70 61 72   aCell and aSpar
11a50 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  e all point to a
11a60 72 72 61 79 73 20 6f 66 20 73 69 7a 65 0a 2a 2a  rrays of size.**
11a70 20 6e 49 64 78 2e 20 54 68 65 20 61 49 64 78 20   nIdx. The aIdx 
11a80 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
11a90 68 65 20 73 65 74 20 6f 66 20 69 6e 74 65 67 65  he set of intege
11aa0 72 73 20 66 72 6f 6d 20 30 20 74 6f 20 0a 2a 2a  rs from 0 to .**
11ab0 20 28 6e 49 64 78 2d 31 29 20 69 6e 20 6e 6f 20   (nIdx-1) in no 
11ac0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
11ad0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
11ae0 73 6f 72 74 73 20 74 68 65 20 76 61 6c 75 65 73  sorts the values
11af0 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61 63 63 6f  .** in aIdx acco
11b00 72 64 69 6e 67 20 74 6f 20 64 69 6d 65 6e 73 69  rding to dimensi
11b10 6f 6e 20 69 44 69 6d 20 6f 66 20 74 68 65 20 63  on iDim of the c
11b20 65 6c 6c 73 20 69 6e 20 61 43 65 6c 6c 2e 20 54  ells in aCell. T
11b30 68 65 0a 2a 2a 20 6d 69 6e 69 6d 75 6d 20 76 61  he.** minimum va
11b40 6c 75 65 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  lue of dimension
11b50 20 69 44 69 6d 20 69 73 20 63 6f 6e 73 69 64 65   iDim is conside
11b60 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 0a 2a  red first, the.*
11b70 2a 20 6d 61 78 69 6d 75 6d 20 75 73 65 64 20 74  * maximum used t
11b80 6f 20 62 72 65 61 6b 20 74 69 65 73 2e 0a 2a 2a  o break ties..**
11b90 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65 20 61  .** The aSpare a
11ba0 72 72 61 79 20 69 73 20 75 73 65 64 20 61 73 20  rray is used as 
11bb0 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b 69 6e  temporary workin
11bc0 67 20 73 70 61 63 65 20 62 79 20 74 68 65 0a 2a  g space by the.*
11bd0 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72 69  * sorting algori
11be0 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  thm..*/.static v
11bf0 6f 69 64 20 53 6f 72 74 42 79 44 69 6d 65 6e 73  oid SortByDimens
11c00 69 6f 6e 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ion(.  Rtree *pR
11c10 74 72 65 65 2c 0a 20 20 69 6e 74 20 2a 61 49 64  tree,.  int *aId
11c20 78 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20  x, .  int nIdx, 
11c30 0a 20 20 69 6e 74 20 69 44 69 6d 2c 20 0a 20 20  .  int iDim, .  
11c40 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c  RtreeCell *aCell
11c50 2c 20 0a 20 20 69 6e 74 20 2a 61 53 70 61 72 65  , .  int *aSpare
11c60 0a 29 7b 0a 20 20 69 66 28 20 6e 49 64 78 3e 31  .){.  if( nIdx>1
11c70 20 29 7b 0a 0a 20 20 20 20 69 6e 74 20 69 4c 65   ){..    int iLe
11c80 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ft = 0;.    int 
11c90 69 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20 20  iRight = 0;..   
11ca0 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 6e 49 64   int nLeft = nId
11cb0 78 2f 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52 69  x/2;.    int nRi
11cc0 67 68 74 20 3d 20 6e 49 64 78 2d 6e 4c 65 66 74  ght = nIdx-nLeft
11cd0 3b 0a 20 20 20 20 69 6e 74 20 2a 61 4c 65 66 74  ;.    int *aLeft
11ce0 20 3d 20 61 49 64 78 3b 0a 20 20 20 20 69 6e 74   = aIdx;.    int
11cf0 20 2a 61 52 69 67 68 74 20 3d 20 26 61 49 64 78   *aRight = &aIdx
11d00 5b 6e 4c 65 66 74 5d 3b 0a 0a 20 20 20 20 53 6f  [nLeft];..    So
11d10 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
11d20 74 72 65 65 2c 20 61 4c 65 66 74 2c 20 6e 4c 65  tree, aLeft, nLe
11d30 66 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c 6c 2c  ft, iDim, aCell,
11d40 20 61 53 70 61 72 65 29 3b 0a 20 20 20 20 53 6f   aSpare);.    So
11d50 72 74 42 79 44 69 6d 65 6e 73 69 6f 6e 28 70 52  rtByDimension(pR
11d60 74 72 65 65 2c 20 61 52 69 67 68 74 2c 20 6e 52  tree, aRight, nR
11d70 69 67 68 74 2c 20 69 44 69 6d 2c 20 61 43 65 6c  ight, iDim, aCel
11d80 6c 2c 20 61 53 70 61 72 65 29 3b 0a 0a 20 20 20  l, aSpare);..   
11d90 20 6d 65 6d 63 70 79 28 61 53 70 61 72 65 2c 20   memcpy(aSpare, 
11da0 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66 28 69 6e  aLeft, sizeof(in
11db0 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20 20 20 61  t)*nLeft);.    a
11dc0 4c 65 66 74 20 3d 20 61 53 70 61 72 65 3b 0a 20  Left = aSpare;. 
11dd0 20 20 20 77 68 69 6c 65 28 20 69 4c 65 66 74 3c     while( iLeft<
11de0 6e 4c 65 66 74 20 7c 7c 20 69 52 69 67 68 74 3c  nLeft || iRight<
11df0 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
11e00 52 74 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66  RtreeDValue xlef
11e10 74 31 20 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c  t1 = DCOORD(aCel
11e20 6c 5b 61 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e  l[aLeft[iLeft]].
11e30 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b  aCoord[iDim*2]);
11e40 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
11e50 75 65 20 78 6c 65 66 74 32 20 3d 20 44 43 4f 4f  ue xleft2 = DCOO
11e60 52 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69  RD(aCell[aLeft[i
11e70 4c 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44  Left]].aCoord[iD
11e80 69 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 20 20  im*2+1]);.      
11e90 52 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67  RtreeDValue xrig
11ea0 68 74 31 20 3d 20 44 43 4f 4f 52 44 28 61 43 65  ht1 = DCOORD(aCe
11eb0 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74  ll[aRight[iRight
11ec0 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
11ed0 5d 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44  ]);.      RtreeD
11ee0 56 61 6c 75 65 20 78 72 69 67 68 74 32 20 3d 20  Value xright2 = 
11ef0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61 52 69  DCOORD(aCell[aRi
11f00 67 68 74 5b 69 52 69 67 68 74 5d 5d 2e 61 43 6f  ght[iRight]].aCo
11f10 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
11f20 20 20 20 20 20 20 69 66 28 20 28 69 4c 65 66 74        if( (iLeft
11f30 21 3d 6e 4c 65 66 74 29 20 26 26 20 28 28 69 52  !=nLeft) && ((iR
11f40 69 67 68 74 3d 3d 6e 52 69 67 68 74 29 0a 20 20  ight==nRight).  
11f50 20 20 20 20 20 7c 7c 20 28 78 6c 65 66 74 31 3c       || (xleft1<
11f60 78 72 69 67 68 74 31 29 0a 20 20 20 20 20 20 20  xright1).       
11f70 7c 7c 20 28 78 6c 65 66 74 31 3d 3d 78 72 69 67  || (xleft1==xrig
11f80 68 74 31 20 26 26 20 78 6c 65 66 74 32 3c 78 72  ht1 && xleft2<xr
11f90 69 67 68 74 32 29 0a 20 20 20 20 20 20 29 29 7b  ight2).      )){
11fa0 0a 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c  .        aIdx[iL
11fb0 65 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 4c  eft+iRight] = aL
11fc0 65 66 74 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20  eft[iLeft];.    
11fd0 20 20 20 20 69 4c 65 66 74 2b 2b 3b 0a 20 20 20      iLeft++;.   
11fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ff0 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
12000 67 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52  ght] = aRight[iR
12010 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  ight];.        i
12020 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  Right++;.      }
12030 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
12040 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
12050 74 68 65 20 73 6f 72 74 20 77 6f 72 6b 65 64 20  the sort worked 
12060 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
12070 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72  nt jj;.      for
12080 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20  (jj=1; jj<nIdx; 
12090 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 52  jj++){.        R
120a0 74 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74  treeDValue xleft
120b0 31 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a  1 = aCell[aIdx[j
120c0 6a 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  j-1]].aCoord[iDi
120d0 6d 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 74  m*2];.        Rt
120e0 72 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74 32  reeDValue xleft2
120f0 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
12100 2d 31 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  -1]].aCoord[iDim
12110 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 52  *2+1];.        R
12120 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67 68  treeDValue xrigh
12130 74 31 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b  t1 = aCell[aIdx[
12140 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d  jj]].aCoord[iDim
12150 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  *2];.        Rtr
12160 65 65 44 56 61 6c 75 65 20 78 72 69 67 68 74 32  eeDValue xright2
12170 20 3d 20 61 43 65 6c 6c 5b 61 49 64 78 5b 6a 6a   = aCell[aIdx[jj
12180 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
12190 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +1];.        ass
121a0 65 72 74 28 20 78 6c 65 66 74 31 3c 3d 78 72 69  ert( xleft1<=xri
121b0 67 68 74 31 20 26 26 20 28 78 6c 65 66 74 31 3c  ght1 && (xleft1<
121c0 78 72 69 67 68 74 31 20 7c 7c 20 78 6c 65 66 74  xright1 || xleft
121d0 32 3c 3d 78 72 69 67 68 74 32 29 20 29 3b 0a 20  2<=xright2) );. 
121e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
121f0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
12200 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
12210 6f 66 20 74 68 65 20 52 2a 2d 74 72 65 65 20 76  of the R*-tree v
12220 61 72 69 61 6e 74 20 6f 66 20 53 70 6c 69 74 4e  ariant of SplitN
12230 6f 64 65 20 66 72 6f 6d 20 42 65 63 6b 6d 61 6e  ode from Beckman
12240 5b 31 39 39 30 5d 2e 0a 2a 2f 0a 73 74 61 74 69  [1990]..*/.stati
12250 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f 64 65 53  c int splitNodeS
12260 74 61 72 74 72 65 65 28 0a 20 20 52 74 72 65 65  tartree(.  Rtree
12270 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65   *pRtree,.  Rtre
12280 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a 20 20  eCell *aCell,.  
12290 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52 74 72  int nCell,.  Rtr
122a0 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 0a 20  eeNode *pLeft,. 
122b0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
122c0 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ht,.  RtreeCell 
122d0 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20 52 74  *pBboxLeft,.  Rt
122e0 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 52 69  reeCell *pBboxRi
122f0 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 2a 61  ght.){.  int **a
12300 61 53 6f 72 74 65 64 3b 0a 20 20 69 6e 74 20 2a  aSorted;.  int *
12310 61 53 70 61 72 65 3b 0a 20 20 69 6e 74 20 69 69  aSpare;.  int ii
12320 3b 0a 0a 20 20 69 6e 74 20 69 42 65 73 74 44 69  ;..  int iBestDi
12330 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 42 65  m = 0;.  int iBe
12340 73 74 53 70 6c 69 74 20 3d 20 30 3b 0a 20 20 52  stSplit = 0;.  R
12350 74 72 65 65 44 56 61 6c 75 65 20 66 42 65 73 74  treeDValue fBest
12360 4d 61 72 67 69 6e 20 3d 20 52 54 52 45 45 5f 5a  Margin = RTREE_Z
12370 45 52 4f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ERO;..  sqlite3_
12380 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 70  int64 nByte = (p
12390 52 74 72 65 65 2d 3e 6e 44 69 6d 2b 31 29 2a 28  Rtree->nDim+1)*(
123a0 73 69 7a 65 6f 66 28 69 6e 74 2a 29 2b 6e 43 65  sizeof(int*)+nCe
123b0 6c 6c 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ll*sizeof(int));
123c0 0a 0a 20 20 61 61 53 6f 72 74 65 64 20 3d 20 28  ..  aaSorted = (
123d0 69 6e 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d  int **)sqlite3_m
123e0 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
123f0 20 20 69 66 28 20 21 61 61 53 6f 72 74 65 64 20    if( !aaSorted 
12400 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12410 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12420 0a 20 20 61 53 70 61 72 65 20 3d 20 26 28 28 69  .  aSpare = &((i
12430 6e 74 20 2a 29 26 61 61 53 6f 72 74 65 64 5b 70  nt *)&aaSorted[p
12440 52 74 72 65 65 2d 3e 6e 44 69 6d 5d 29 5b 70 52  Rtree->nDim])[pR
12450 74 72 65 65 2d 3e 6e 44 69 6d 2a 6e 43 65 6c 6c  tree->nDim*nCell
12460 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 61 53 6f  ];.  memset(aaSo
12470 72 74 65 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b  rted, 0, nByte);
12480 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
12490 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69  pRtree->nDim; ii
124a0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b  ++){.    int jj;
124b0 0a 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69  .    aaSorted[ii
124c0 5d 20 3d 20 26 28 28 69 6e 74 20 2a 29 26 61 61  ] = &((int *)&aa
124d0 53 6f 72 74 65 64 5b 70 52 74 72 65 65 2d 3e 6e  Sorted[pRtree->n
124e0 44 69 6d 5d 29 5b 69 69 2a 6e 43 65 6c 6c 5d 3b  Dim])[ii*nCell];
124f0 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a  .    for(jj=0; j
12500 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a  j<nCell; jj++){.
12510 20 20 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69        aaSorted[i
12520 69 5d 5b 6a 6a 5d 20 3d 20 6a 6a 3b 0a 20 20 20  i][jj] = jj;.   
12530 20 7d 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d   }.    SortByDim
12540 65 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61  ension(pRtree, a
12550 61 53 6f 72 74 65 64 5b 69 69 5d 2c 20 6e 43 65  aSorted[ii], nCe
12560 6c 6c 2c 20 69 69 2c 20 61 43 65 6c 6c 2c 20 61  ll, ii, aCell, a
12570 53 70 61 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  Spare);.  }..  f
12580 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72  or(ii=0; ii<pRtr
12590 65 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b  ee->nDim; ii++){
125a0 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65  .    RtreeDValue
125b0 20 6d 61 72 67 69 6e 20 3d 20 52 54 52 45 45 5f   margin = RTREE_
125c0 5a 45 52 4f 3b 0a 20 20 20 20 52 74 72 65 65 44  ZERO;.    RtreeD
125d0 56 61 6c 75 65 20 66 42 65 73 74 4f 76 65 72 6c  Value fBestOverl
125e0 61 70 20 3d 20 52 54 52 45 45 5f 5a 45 52 4f 3b  ap = RTREE_ZERO;
125f0 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65  .    RtreeDValue
12600 20 66 42 65 73 74 41 72 65 61 20 3d 20 52 54 52   fBestArea = RTR
12610 45 45 5f 5a 45 52 4f 3b 0a 20 20 20 20 69 6e 74  EE_ZERO;.    int
12620 20 69 42 65 73 74 4c 65 66 74 20 3d 20 30 3b 0a   iBestLeft = 0;.
12630 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 0a      int nLeft;..
12640 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 6e      for(.      n
12650 4c 65 66 74 3d 52 54 52 45 45 5f 4d 49 4e 43 45  Left=RTREE_MINCE
12660 4c 4c 53 28 70 52 74 72 65 65 29 3b 20 0a 20 20  LLS(pRtree); .  
12670 20 20 20 20 6e 4c 65 66 74 3c 3d 28 6e 43 65 6c      nLeft<=(nCel
12680 6c 2d 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53  l-RTREE_MINCELLS
12690 28 70 52 74 72 65 65 29 29 3b 20 0a 20 20 20 20  (pRtree)); .    
126a0 20 20 6e 4c 65 66 74 2b 2b 0a 20 20 20 20 29 7b    nLeft++.    ){
126b0 0a 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c  .      RtreeCell
126c0 20 6c 65 66 74 3b 0a 20 20 20 20 20 20 52 74 72   left;.      Rtr
126d0 65 65 43 65 6c 6c 20 72 69 67 68 74 3b 0a 20 20  eeCell right;.  
126e0 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20      int kk;.    
126f0 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6f 76    RtreeDValue ov
12700 65 72 6c 61 70 3b 0a 20 20 20 20 20 20 52 74 72  erlap;.      Rtr
12710 65 65 44 56 61 6c 75 65 20 61 72 65 61 3b 0a 0a  eeDValue area;..
12720 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 6c 65        memcpy(&le
12730 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  ft, &aCell[aaSor
12740 74 65 64 5b 69 69 5d 5b 30 5d 5d 2c 20 73 69 7a  ted[ii][0]], siz
12750 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
12760 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 72  .      memcpy(&r
12770 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53  ight, &aCell[aaS
12780 6f 72 74 65 64 5b 69 69 5d 5b 6e 43 65 6c 6c 2d  orted[ii][nCell-
12790 31 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  1]], sizeof(Rtre
127a0 65 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 66  eCell));.      f
127b0 6f 72 28 6b 6b 3d 31 3b 20 6b 6b 3c 28 6e 43 65  or(kk=1; kk<(nCe
127c0 6c 6c 2d 31 29 3b 20 6b 6b 2b 2b 29 7b 0a 20 20  ll-1); kk++){.  
127d0 20 20 20 20 20 20 69 66 28 20 6b 6b 3c 6e 4c 65        if( kk<nLe
127e0 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
127f0 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65  cellUnion(pRtree
12800 2c 20 26 6c 65 66 74 2c 20 26 61 43 65 6c 6c 5b  , &left, &aCell[
12810 61 61 53 6f 72 74 65 64 5b 69 69 5d 5b 6b 6b 5d  aaSorted[ii][kk]
12820 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
12830 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c  e{.          cel
12840 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 26  lUnion(pRtree, &
12850 72 69 67 68 74 2c 20 26 61 43 65 6c 6c 5b 61 61  right, &aCell[aa
12860 53 6f 72 74 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29  Sorted[ii][kk]])
12870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12880 20 20 7d 0a 20 20 20 20 20 20 6d 61 72 67 69 6e    }.      margin
12890 20 2b 3d 20 63 65 6c 6c 4d 61 72 67 69 6e 28 70   += cellMargin(p
128a0 52 74 72 65 65 2c 20 26 6c 65 66 74 29 3b 0a 20  Rtree, &left);. 
128b0 20 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63       margin += c
128c0 65 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72 65 65  ellMargin(pRtree
128d0 2c 20 26 72 69 67 68 74 29 3b 0a 20 20 20 20 20  , &right);.     
128e0 20 6f 76 65 72 6c 61 70 20 3d 20 63 65 6c 6c 4f   overlap = cellO
128f0 76 65 72 6c 61 70 28 70 52 74 72 65 65 2c 20 26  verlap(pRtree, &
12900 6c 65 66 74 2c 20 26 72 69 67 68 74 2c 20 31 29  left, &right, 1)
12910 3b 0a 20 20 20 20 20 20 61 72 65 61 20 3d 20 63  ;.      area = c
12920 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20  ellArea(pRtree, 
12930 26 6c 65 66 74 29 20 2b 20 63 65 6c 6c 41 72 65  &left) + cellAre
12940 61 28 70 52 74 72 65 65 2c 20 26 72 69 67 68 74  a(pRtree, &right
12950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 4c  );.      if( (nL
12960 65 66 74 3d 3d 52 54 52 45 45 5f 4d 49 4e 43 45  eft==RTREE_MINCE
12970 4c 4c 53 28 70 52 74 72 65 65 29 29 0a 20 20 20  LLS(pRtree)).   
12980 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3c      || (overlap<
12990 66 42 65 73 74 4f 76 65 72 6c 61 70 29 0a 20 20  fBestOverlap).  
129a0 20 20 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70       || (overlap
129b0 3d 3d 66 42 65 73 74 4f 76 65 72 6c 61 70 20 26  ==fBestOverlap &
129c0 26 20 61 72 65 61 3c 66 42 65 73 74 41 72 65 61  & area<fBestArea
129d0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
129e0 20 20 20 69 42 65 73 74 4c 65 66 74 20 3d 20 6e     iBestLeft = n
129f0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 66 42  Left;.        fB
12a00 65 73 74 4f 76 65 72 6c 61 70 20 3d 20 6f 76 65  estOverlap = ove
12a10 72 6c 61 70 3b 0a 20 20 20 20 20 20 20 20 66 42  rlap;.        fB
12a20 65 73 74 41 72 65 61 20 3d 20 61 72 65 61 3b 0a  estArea = area;.
12a30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12a40 20 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20     if( ii==0 || 
12a50 6d 61 72 67 69 6e 3c 66 42 65 73 74 4d 61 72 67  margin<fBestMarg
12a60 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 42 65 73  in ){.      iBes
12a70 74 44 69 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20  tDim = ii;.     
12a80 20 66 42 65 73 74 4d 61 72 67 69 6e 20 3d 20 6d   fBestMargin = m
12a90 61 72 67 69 6e 3b 0a 20 20 20 20 20 20 69 42 65  argin;.      iBe
12aa0 73 74 53 70 6c 69 74 20 3d 20 69 42 65 73 74 4c  stSplit = iBestL
12ab0 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eft;.    }.  }..
12ac0 20 20 6d 65 6d 63 70 79 28 70 42 62 6f 78 4c 65    memcpy(pBboxLe
12ad0 66 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72  ft, &aCell[aaSor
12ae0 74 65 64 5b 69 42 65 73 74 44 69 6d 5d 5b 30 5d  ted[iBestDim][0]
12af0 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43  ], sizeof(RtreeC
12b00 65 6c 6c 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ell));.  memcpy(
12b10 70 42 62 6f 78 52 69 67 68 74 2c 20 26 61 43 65  pBboxRight, &aCe
12b20 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42 65 73  ll[aaSorted[iBes
12b30 74 44 69 6d 5d 5b 69 42 65 73 74 53 70 6c 69 74  tDim][iBestSplit
12b40 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65  ]], sizeof(Rtree
12b50 43 65 6c 6c 29 29 3b 0a 20 20 66 6f 72 28 69 69  Cell));.  for(ii
12b60 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69  =0; ii<nCell; ii
12b70 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f  ++){.    RtreeNo
12b80 64 65 20 2a 70 54 61 72 67 65 74 20 3d 20 28 69  de *pTarget = (i
12b90 69 3c 69 42 65 73 74 53 70 6c 69 74 29 3f 70 4c  i<iBestSplit)?pL
12ba0 65 66 74 3a 70 52 69 67 68 74 3b 0a 20 20 20 20  eft:pRight;.    
12bb0 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78  RtreeCell *pBbox
12bc0 20 3d 20 28 69 69 3c 69 42 65 73 74 53 70 6c 69   = (ii<iBestSpli
12bd0 74 29 3f 70 42 62 6f 78 4c 65 66 74 3a 70 42 62  t)?pBboxLeft:pBb
12be0 6f 78 52 69 67 68 74 3b 0a 20 20 20 20 52 74 72  oxRight;.    Rtr
12bf0 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20  eeCell *pCell = 
12c00 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b  &aCell[aaSorted[
12c10 69 42 65 73 74 44 69 6d 5d 5b 69 69 5d 5d 3b 0a  iBestDim][ii]];.
12c20 20 20 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65      nodeInsertCe
12c30 6c 6c 28 70 52 74 72 65 65 2c 20 70 54 61 72 67  ll(pRtree, pTarg
12c40 65 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  et, pCell);.    
12c50 63 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65  cellUnion(pRtree
12c60 2c 20 70 42 62 6f 78 2c 20 70 43 65 6c 6c 29 3b  , pBbox, pCell);
12c70 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
12c80 66 72 65 65 28 61 61 53 6f 72 74 65 64 29 3b 0a  free(aaSorted);.
12c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12ca0 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  OK;.}...static i
12cb0 6e 74 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67  nt updateMapping
12cc0 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  (.  Rtree *pRtre
12cd0 65 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  e, .  i64 iRowid
12ce0 2c 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  , .  RtreeNode *
12cf0 70 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69 48  pNode, .  int iH
12d00 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 28  eight.){.  int (
12d10 2a 78 53 65 74 4d 61 70 70 69 6e 67 29 28 52 74  *xSetMapping)(Rt
12d20 72 65 65 20 2a 2c 20 73 71 6c 69 74 65 33 5f 69  ree *, sqlite3_i
12d30 6e 74 36 34 2c 20 73 71 6c 69 74 65 33 5f 69 6e  nt64, sqlite3_in
12d40 74 36 34 29 3b 0a 20 20 78 53 65 74 4d 61 70 70  t64);.  xSetMapp
12d50 69 6e 67 20 3d 20 28 28 69 48 65 69 67 68 74 3d  ing = ((iHeight=
12d60 3d 30 29 3f 72 6f 77 69 64 57 72 69 74 65 3a 70  =0)?rowidWrite:p
12d70 61 72 65 6e 74 57 72 69 74 65 29 3b 0a 20 20 69  arentWrite);.  i
12d80 66 28 20 69 48 65 69 67 68 74 3e 30 20 29 7b 0a  f( iHeight>0 ){.
12d90 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
12da0 43 68 69 6c 64 20 3d 20 6e 6f 64 65 48 61 73 68  Child = nodeHash
12db0 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20 69  Lookup(pRtree, i
12dc0 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
12dd0 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  pChild ){.      
12de0 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74 72  nodeRelease(pRtr
12df0 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61 72  ee, pChild->pPar
12e00 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65  ent);.      node
12e10 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65 29  Reference(pNode)
12e20 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
12e30 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 3b  pParent = pNode;
12e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12e50 75 72 6e 20 78 53 65 74 4d 61 70 70 69 6e 67 28  urn xSetMapping(
12e60 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
12e70 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 7d  pNode->iNode);.}
12e80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 70 6c  ..static int Spl
12e90 69 74 4e 6f 64 65 28 0a 20 20 52 74 72 65 65 20  itNode(.  Rtree 
12ea0 2a 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65  *pRtree,.  Rtree
12eb0 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52  Node *pNode,.  R
12ec0 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c  treeCell *pCell,
12ed0 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29  .  int iHeight.)
12ee0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
12ef0 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74 20   newCellIsRight 
12f00 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  = 0;..  int rc =
12f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12f20 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
12f30 70 4e 6f 64 65 29 3b 0a 20 20 52 74 72 65 65 43  pNode);.  RtreeC
12f40 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a 20 20 69 6e  ell *aCell;.  in
12f50 74 20 2a 61 69 55 73 65 64 3b 0a 0a 20 20 52 74  t *aiUsed;..  Rt
12f60 72 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 20 3d  reeNode *pLeft =
12f70 20 30 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20   0;.  RtreeNode 
12f80 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20 20  *pRight = 0;..  
12f90 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74 62 62  RtreeCell leftbb
12fa0 6f 78 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  ox;.  RtreeCell 
12fb0 72 69 67 68 74 62 62 6f 78 3b 0a 0a 20 20 2f 2a  rightbbox;..  /*
12fc0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 61 72 72   Allocate an arr
12fd0 61 79 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  ay and populate 
12fe0 69 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  it with a copy o
12ff0 66 20 70 43 65 6c 6c 20 61 6e 64 20 0a 20 20 2a  f pCell and .  *
13000 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * all cells from
13010 20 6e 6f 64 65 20 70 4c 65 66 74 2e 20 54 68 65   node pLeft. The
13020 6e 20 7a 65 72 6f 20 74 68 65 20 6f 72 69 67 69  n zero the origi
13030 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 2a 2f 0a 20  nal node..  */. 
13040 20 61 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33   aCell = sqlite3
13050 5f 6d 61 6c 6c 6f 63 36 34 28 28 73 69 7a 65 6f  _malloc64((sizeo
13060 66 28 52 74 72 65 65 43 65 6c 6c 29 2b 73 69 7a  f(RtreeCell)+siz
13070 65 6f 66 28 69 6e 74 29 29 2a 28 6e 43 65 6c 6c  eof(int))*(nCell
13080 2b 31 29 29 3b 0a 20 20 69 66 28 20 21 61 43 65  +1));.  if( !aCe
13090 6c 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ll ){.    rc = S
130a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
130b0 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
130c0 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 69 55 73 65  out;.  }.  aiUse
130d0 64 20 3d 20 28 69 6e 74 20 2a 29 26 61 43 65 6c  d = (int *)&aCel
130e0 6c 5b 6e 43 65 6c 6c 2b 31 5d 3b 0a 20 20 6d 65  l[nCell+1];.  me
130f0 6d 73 65 74 28 61 69 55 73 65 64 2c 20 30 2c 20  mset(aiUsed, 0, 
13100 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 65  sizeof(int)*(nCe
13110 6c 6c 2b 31 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ll+1));.  for(i=
13120 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
13130 7b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c  {.    nodeGetCel
13140 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  l(pRtree, pNode,
13150 20 69 2c 20 26 61 43 65 6c 6c 5b 69 5d 29 3b 0a   i, &aCell[i]);.
13160 20 20 7d 0a 20 20 6e 6f 64 65 5a 65 72 6f 28 70    }.  nodeZero(p
13170 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
13180 20 6d 65 6d 63 70 79 28 26 61 43 65 6c 6c 5b 6e   memcpy(&aCell[n
13190 43 65 6c 6c 5d 2c 20 70 43 65 6c 6c 2c 20 73 69  Cell], pCell, si
131a0 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29  zeof(RtreeCell))
131b0 3b 0a 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 0a 20 20  ;.  nCell++;..  
131c0 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  if( pNode->iNode
131d0 3d 3d 31 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ==1 ){.    pRigh
131e0 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74 72  t = nodeNew(pRtr
131f0 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20  ee, pNode);.    
13200 70 4c 65 66 74 20 3d 20 6e 6f 64 65 4e 65 77 28  pLeft = nodeNew(
13210 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a  pRtree, pNode);.
13220 20 20 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70      pRtree->iDep
13230 74 68 2b 2b 3b 0a 20 20 20 20 70 4e 6f 64 65 2d  th++;.    pNode-
13240 3e 69 73 44 69 72 74 79 20 3d 20 31 3b 0a 20 20  >isDirty = 1;.  
13250 20 20 77 72 69 74 65 49 6e 74 31 36 28 70 4e 6f    writeInt16(pNo
13260 64 65 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72 65  de->zData, pRtre
13270 65 2d 3e 69 44 65 70 74 68 29 3b 0a 20 20 7d 65  e->iDepth);.  }e
13280 6c 73 65 7b 0a 20 20 20 20 70 4c 65 66 74 20 3d  lse{.    pLeft =
13290 20 70 4e 6f 64 65 3b 0a 20 20 20 20 70 52 69 67   pNode;.    pRig
132a0 68 74 20 3d 20 6e 6f 64 65 4e 65 77 28 70 52 74  ht = nodeNew(pRt
132b0 72 65 65 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72  ree, pLeft->pPar
132c0 65 6e 74 29 3b 0a 20 20 20 20 70 4c 65 66 74 2d  ent);.    pLeft-
132d0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nRef++;.  }..  
132e0 69 66 28 20 21 70 4c 65 66 74 20 7c 7c 20 21 70  if( !pLeft || !p
132f0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72 63 20  Right ){.    rc 
13300 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13310 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
13320 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 6d  de_out;.  }..  m
13330 65 6d 73 65 74 28 70 4c 65 66 74 2d 3e 7a 44 61  emset(pLeft->zDa
13340 74 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69  ta, 0, pRtree->i
13350 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 6d 65 6d  NodeSize);.  mem
13360 73 65 74 28 70 52 69 67 68 74 2d 3e 7a 44 61 74  set(pRight->zDat
13370 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e  a, 0, pRtree->iN
13380 6f 64 65 53 69 7a 65 29 3b 0a 0a 20 20 72 63 20  odeSize);..  rc 
13390 3d 20 73 70 6c 69 74 4e 6f 64 65 53 74 61 72 74  = splitNodeStart
133a0 72 65 65 28 70 52 74 72 65 65 2c 20 61 43 65 6c  ree(pRtree, aCel
133b0 6c 2c 20 6e 43 65 6c 6c 2c 20 70 4c 65 66 74 2c  l, nCell, pLeft,
133c0 20 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20   pRight,.       
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 26 6c 65 66 74 62 62 6f 78 2c 20 26 72 69    &leftbbox, &ri
133f0 67 68 74 62 62 6f 78 29 3b 0a 20 20 69 66 28 20  ghtbbox);.  if( 
13400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13410 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e  .    goto splitn
13420 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ode_out;.  }..  
13430 2f 2a 20 45 6e 73 75 72 65 20 62 6f 74 68 20 63  /* Ensure both c
13440 68 69 6c 64 20 6e 6f 64 65 73 20 68 61 76 65 20  hild nodes have 
13450 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 73  node numbers ass
13460 69 67 6e 65 64 20 74 6f 20 74 68 65 6d 20 62 79  igned to them by
13470 20 63 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20 6e 6f   calling.  ** no
13480 64 65 57 72 69 74 65 28 29 2e 20 4e 6f 64 65 20  deWrite(). Node 
13490 70 52 69 67 68 74 20 61 6c 77 61 79 73 20 6e 65  pRight always ne
134a0 65 64 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65  eds a node numbe
134b0 72 2c 20 61 73 20 69 74 20 77 61 73 20 63 72 65  r, as it was cre
134c0 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 6e 6f 64  ated.  ** by nod
134d0 65 4e 65 77 28 29 20 61 62 6f 76 65 2e 20 42 75  eNew() above. Bu
134e0 74 20 6e 6f 64 65 20 70 4c 65 66 74 20 73 6f 6d  t node pLeft som
134f0 65 74 69 6d 65 73 20 61 6c 72 65 61 64 79 20 68  etimes already h
13500 61 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65 72  as a node number
13510 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
13520 61 73 65 20 61 76 6f 69 64 20 74 68 65 20 61 6c  ase avoid the al
13530 6c 20 74 6f 20 6e 6f 64 65 57 72 69 74 65 28 29  l to nodeWrite()
13540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
13550 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e 6f  ITE_OK!=(rc = no
13560 64 65 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  deWrite(pRtree, 
13570 70 52 69 67 68 74 29 29 0a 20 20 20 7c 7c 20 28  pRight)).   || (
13580 30 3d 3d 70 4c 65 66 74 2d 3e 69 4e 6f 64 65 20  0==pLeft->iNode 
13590 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
135a0 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28 70 52  c = nodeWrite(pR
135b0 74 72 65 65 2c 20 70 4c 65 66 74 29 29 29 0a 20  tree, pLeft))). 
135c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c   ){.    goto spl
135d0 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a  itnode_out;.  }.
135e0 0a 20 20 72 69 67 68 74 62 62 6f 78 2e 69 52 6f  .  rightbbox.iRo
135f0 77 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 4e  wid = pRight->iN
13600 6f 64 65 3b 0a 20 20 6c 65 66 74 62 62 6f 78 2e  ode;.  leftbbox.
13610 69 52 6f 77 69 64 20 3d 20 70 4c 65 66 74 2d 3e  iRowid = pLeft->
13620 69 4e 6f 64 65 3b 0a 0a 20 20 69 66 28 20 70 4e  iNode;..  if( pN
13630 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b  ode->iNode==1 ){
13640 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49  .    rc = rtreeI
13650 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
13660 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74  , pLeft->pParent
13670 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 69 48 65  , &leftbbox, iHe
13680 69 67 68 74 2b 31 29 3b 0a 20 20 20 20 69 66 28  ight+1);.    if(
13690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
136a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70 6c  {.      goto spl
136b0 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  itnode_out;.    
136c0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 52  }.  }else{.    R
136d0 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e  treeNode *pParen
136e0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 50 61 72 65  t = pLeft->pPare
136f0 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c  nt;.    int iCel
13700 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  l;.    rc = node
13710 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74 72  ParentIndex(pRtr
13720 65 65 2c 20 70 4c 65 66 74 2c 20 26 69 43 65 6c  ee, pLeft, &iCel
13730 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
13740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13750 20 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74 65     nodeOverwrite
13760 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50 61  Cell(pRtree, pPa
13770 72 65 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c  rent, &leftbbox,
13780 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72   iCell);.      r
13790 63 20 3d 20 41 64 6a 75 73 74 54 72 65 65 28 70  c = AdjustTree(p
137a0 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20  Rtree, pParent, 
137b0 26 6c 65 66 74 62 62 6f 78 29 3b 0a 20 20 20 20  &leftbbox);.    
137c0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
137d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
137e0 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65 5f   goto splitnode_
137f0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
13800 20 69 66 28 20 28 72 63 20 3d 20 72 74 72 65 65   if( (rc = rtree
13810 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65  InsertCell(pRtre
13820 65 2c 20 70 52 69 67 68 74 2d 3e 70 50 61 72 65  e, pRight->pPare
13830 6e 74 2c 20 26 72 69 67 68 74 62 62 6f 78 2c 20  nt, &rightbbox, 
13840 69 48 65 69 67 68 74 2b 31 29 29 20 29 7b 0a 20  iHeight+1)) ){. 
13850 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
13860 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f  e_out;.  }..  fo
13870 72 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28 70  r(i=0; i<NCELL(p
13880 52 69 67 68 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  Right); i++){.  
13890 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 6e    i64 iRowid = n
138a0 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74 72  odeGetRowid(pRtr
138b0 65 65 2c 20 70 52 69 67 68 74 2c 20 69 29 3b 0a  ee, pRight, i);.
138c0 20 20 20 20 72 63 20 3d 20 75 70 64 61 74 65 4d      rc = updateM
138d0 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20 69  apping(pRtree, i
138e0 52 6f 77 69 64 2c 20 70 52 69 67 68 74 2c 20 69  Rowid, pRight, i
138f0 48 65 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  Height);.    if(
13900 20 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e   iRowid==pCell->
13910 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
13920 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74 20 3d  newCellIsRight =
13930 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
13940 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13950 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70  ){.      goto sp
13960 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20  litnode_out;.   
13970 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f   }.  }.  if( pNo
13980 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a  de->iNode==1 ){.
13990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
139a0 43 45 4c 4c 28 70 4c 65 66 74 29 3b 20 69 2b 2b  CELL(pLeft); i++
139b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
139c0 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77  wid = nodeGetRow
139d0 69 64 28 70 52 74 72 65 65 2c 20 70 4c 65 66 74  id(pRtree, pLeft
139e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , i);.      rc =
139f0 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70   updateMapping(p
13a00 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20 70  Rtree, iRowid, p
13a10 4c 65 66 74 2c 20 69 48 65 69 67 68 74 29 3b 0a  Left, iHeight);.
13a20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13a40 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64     goto splitnod
13a50 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
13a60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
13a70 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74 3d   newCellIsRight=
13a80 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
13a90 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70 52 74  pdateMapping(pRt
13aa0 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77  ree, pCell->iRow
13ab0 69 64 2c 20 70 4c 65 66 74 2c 20 69 48 65 69 67  id, pLeft, iHeig
13ac0 68 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ht);.  }..  if( 
13ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13ae0 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65  .    rc = nodeRe
13af0 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52  lease(pRtree, pR
13b00 69 67 68 74 29 3b 0a 20 20 20 20 70 52 69 67 68  ight);.    pRigh
13b10 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
13b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13b30 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52  {.    rc = nodeR
13b40 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
13b50 4c 65 66 74 29 3b 0a 20 20 20 20 70 4c 65 66 74  Left);.    pLeft
13b60 20 3d 20 30 3b 0a 20 20 7d 0a 0a 73 70 6c 69 74   = 0;.  }..split
13b70 6e 6f 64 65 5f 6f 75 74 3a 0a 20 20 6e 6f 64 65  node_out:.  node
13b80 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
13b90 70 52 69 67 68 74 29 3b 0a 20 20 6e 6f 64 65 52  pRight);.  nodeR
13ba0 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
13bb0 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
13bc0 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20  _free(aCell);.  
13bd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13be0 0a 2a 2a 20 49 66 20 6e 6f 64 65 20 70 4c 65 61  .** If node pLea
13bf0 66 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  f is not the roo
13c00 74 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65 20  t of the r-tree 
13c10 61 6e 64 20 69 74 73 20 70 50 61 72 65 6e 74 20  and its pParent 
13c20 70 6f 69 6e 74 65 72 20 69 73 20 0a 2a 2a 20 73  pointer is .** s
13c30 74 69 6c 6c 20 4e 55 4c 4c 2c 20 6c 6f 61 64 20  till NULL, load 
13c40 61 6c 6c 20 61 6e 63 65 73 74 6f 72 20 6e 6f 64  all ancestor nod
13c50 65 73 20 6f 66 20 70 4c 65 61 66 20 69 6e 74 6f  es of pLeaf into
13c60 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 6f 70 75   memory and popu
13c70 6c 61 74 65 0a 2a 2a 20 74 68 65 20 70 4c 65 61  late.** the pLea
13c80 66 2d 3e 70 50 61 72 65 6e 74 20 63 68 61 69 6e  f->pParent chain
13c90 20 61 6c 6c 20 74 68 65 20 77 61 79 20 75 70 20   all the way up 
13ca0 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  to the root node
13cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65  ..**.** This ope
13cc0 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  ration is requir
13cd0 65 64 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73  ed when a row is
13ce0 20 64 65 6c 65 74 65 64 20 28 6f 72 20 75 70 64   deleted (or upd
13cf0 61 74 65 64 20 2d 20 61 6e 20 75 70 64 61 74 65  ated - an update
13d00 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
13d10 65 64 20 61 73 20 61 20 64 65 6c 65 74 65 20 66  ed as a delete f
13d20 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69 6e  ollowed by an in
13d30 73 65 72 74 29 2e 20 53 51 4c 69 74 65 20 70 72  sert). SQLite pr
13d40 6f 76 69 64 65 73 20 74 68 65 0a 2a 2a 20 72 6f  ovides the.** ro
13d50 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 74  wid of the row t
13d60 6f 20 64 65 6c 65 74 65 2c 20 77 68 69 63 68 20  o delete, which 
13d70 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66  can be used to f
13d80 69 6e 64 20 74 68 65 20 6c 65 61 66 20 6f 6e 20  ind the leaf on 
13d90 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65 6e 74  which.** the ent
13da0 72 79 20 72 65 73 69 64 65 73 20 28 61 72 67 75  ry resides (argu
13db0 6d 65 6e 74 20 70 4c 65 61 66 29 2e 20 4f 6e 63  ment pLeaf). Onc
13dc0 65 20 74 68 65 20 6c 65 61 66 20 69 73 20 6c 6f  e the leaf is lo
13dd0 63 61 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  cated, this .** 
13de0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13df0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
13e00 69 74 73 20 61 6e 63 65 73 74 72 79 2e 0a 2a 2f  its ancestry..*/
13e10 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 78 4c  .static int fixL
13e20 65 61 66 50 61 72 65 6e 74 28 52 74 72 65 65 20  eafParent(Rtree 
13e30 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
13e40 64 65 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  de *pLeaf){.  in
13e50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13e60 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70  ;.  RtreeNode *p
13e70 43 68 69 6c 64 20 3d 20 70 4c 65 61 66 3b 0a 20  Child = pLeaf;. 
13e80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
13e90 54 45 5f 4f 4b 20 26 26 20 70 43 68 69 6c 64 2d  TE_OK && pChild-
13ea0 3e 69 4e 6f 64 65 21 3d 31 20 26 26 20 70 43 68  >iNode!=1 && pCh
13eb0 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  ild->pParent==0 
13ec0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
13ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13ee0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
13ef0 72 65 73 65 74 28 29 20 72 65 74 75 72 6e 20 63  reset() return c
13f00 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ode */.    sqlit
13f10 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52  e3_bind_int64(pR
13f20 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e  tree->pReadParen
13f30 74 2c 20 31 2c 20 70 43 68 69 6c 64 2d 3e 69 4e  t, 1, pChild->iN
13f40 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ode);.    rc = s
13f50 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74 72  qlite3_step(pRtr
13f60 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74 29  ee->pReadParent)
13f70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13f80 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
13f90 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 54 65    RtreeNode *pTe
13fa0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
13fb0 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   Used to test fo
13fc0 72 20 72 65 66 65 72 65 6e 63 65 20 6c 6f 6f 70  r reference loop
13fd0 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  s */.      i64 i
13fe0 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Node;           
13ff0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6e         /* Node n
14000 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74 20  umber of parent 
14010 6e 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  node */..      /
14020 2a 20 42 65 66 6f 72 65 20 73 65 74 74 69 6e 67  * Before setting
14030 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74   pChild->pParent
14040 2c 20 74 65 73 74 20 74 68 61 74 20 77 65 20 61  , test that we a
14050 72 65 20 6e 6f 74 20 63 72 65 61 74 69 6e 67 20  re not creating 
14060 61 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20  a.      ** loop 
14070 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 28 61  of references (a
14080 73 20 77 65 20 77 6f 75 6c 64 20 69 66 2c 20 73  s we would if, s
14090 61 79 2c 20 70 43 68 69 6c 64 3d 3d 70 50 61 72  ay, pChild==pPar
140a0 65 6e 74 29 2e 20 57 65 20 64 6f 6e 27 74 0a 20  ent). We don't. 
140b0 20 20 20 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20       ** want to 
140c0 64 6f 20 74 68 69 73 20 61 73 20 69 74 20 6c 65  do this as it le
140d0 61 64 73 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ads to a memory 
140e0 6c 65 61 6b 20 77 68 65 6e 20 74 72 79 69 6e 67  leak when trying
140f0 20 74 6f 20 64 65 6c 65 74 65 0a 20 20 20 20 20   to delete.     
14100 20 2a 2a 20 74 68 65 20 72 65 66 65 72 65 6e 63   ** the referenc
14110 65 64 20 63 6f 75 6e 74 65 64 20 6e 6f 64 65 20  ed counted node 
14120 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20 20 20  structures..    
14130 20 20 2a 2f 0a 20 20 20 20 20 20 69 4e 6f 64 65    */.      iNode
14140 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
14150 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  n_int64(pRtree->
14160 70 52 65 61 64 50 61 72 65 6e 74 2c 20 30 29 3b  pReadParent, 0);
14170 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 73 74  .      for(pTest
14180 3d 70 4c 65 61 66 3b 20 70 54 65 73 74 20 26 26  =pLeaf; pTest &&
14190 20 70 54 65 73 74 2d 3e 69 4e 6f 64 65 21 3d 69   pTest->iNode!=i
141a0 4e 6f 64 65 3b 20 70 54 65 73 74 3d 70 54 65 73  Node; pTest=pTes
141b0 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  t->pParent);.   
141c0 20 20 20 69 66 28 20 21 70 54 65 73 74 20 29 7b     if( !pTest ){
141d0 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 6e  .        rc2 = n
141e0 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
141f0 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20 26 70 43  e, iNode, 0, &pC
14200 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  hild->pParent);.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
14230 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52 65  eset(pRtree->pRe
14240 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69  adParent);.    i
14250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14260 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20   ) rc = rc2;.   
14270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14280 4f 4b 20 26 26 20 21 70 43 68 69 6c 64 2d 3e 70  OK && !pChild->p
14290 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
142a0 52 54 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54  RTREE_IS_CORRUPT
142b0 28 70 52 74 72 65 65 29 3b 0a 20 20 20 20 20 20  (pRtree);.      
142c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
142d0 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a  UPT_VTAB;.    }.
142e0 20 20 20 20 70 43 68 69 6c 64 20 3d 20 70 43 68      pChild = pCh
142f0 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ild->pParent;.  
14300 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
14310 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  ..static int del
14320 65 74 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c  eteCell(Rtree *,
14330 20 52 74 72 65 65 4e 6f 64 65 20 2a 2c 20 69 6e   RtreeNode *, in
14340 74 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63  t, int);..static
14350 20 69 6e 74 20 72 65 6d 6f 76 65 4e 6f 64 65 28   int removeNode(
14360 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
14370 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
14380 20 69 6e 74 20 69 48 65 69 67 68 74 29 7b 0a 20   int iHeight){. 
14390 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72   int rc;.  int r
143a0 63 32 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  c2;.  RtreeNode 
143b0 2a 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  *pParent = 0;.  
143c0 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 61 73  int iCell;..  as
143d0 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 52 65  sert( pNode->nRe
143e0 66 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  f==1 );..  /* Re
143f0 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 20 69  move the entry i
14400 6e 20 74 68 65 20 70 61 72 65 6e 74 20 63 65 6c  n the parent cel
14410 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6e 6f 64  l. */.  rc = nod
14420 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74  eParentIndex(pRt
14430 72 65 65 2c 20 70 4e 6f 64 65 2c 20 26 69 43 65  ree, pNode, &iCe
14440 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ll);.  if( rc==S
14450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14460 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d  pParent = pNode-
14470 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e  >pParent;.    pN
14480 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  ode->pParent = 0
14490 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 6c 65 74  ;.    rc = delet
144a0 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50  eCell(pRtree, pP
144b0 61 72 65 6e 74 2c 20 69 43 65 6c 6c 2c 20 69 48  arent, iCell, iH
144c0 65 69 67 68 74 2b 31 29 3b 0a 20 20 7d 0a 20 20  eight+1);.  }.  
144d0 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73  rc2 = nodeReleas
144e0 65 28 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e  e(pRtree, pParen
144f0 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
14500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14510 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 69  c = rc2;.  }.  i
14520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
14540 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  c;.  }..  /* Rem
14550 6f 76 65 20 74 68 65 20 78 78 78 5f 6e 6f 64 65  ove the xxx_node
14560 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71 6c   entry. */.  sql
14570 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14580 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 4e  pRtree->pDeleteN
14590 6f 64 65 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e 69  ode, 1, pNode->i
145a0 4e 6f 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Node);.  sqlite3
145b0 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 44  _step(pRtree->pD
145c0 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 69 66  eleteNode);.  if
145d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
145e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
145f0 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
14600 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Node)) ){.    re
14610 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
14620 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 78 78  /* Remove the xx
14630 78 5f 70 61 72 65 6e 74 20 65 6e 74 72 79 2e 20  x_parent entry. 
14640 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  */.  sqlite3_bin
14650 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  d_int64(pRtree->
14660 70 44 65 6c 65 74 65 50 61 72 65 6e 74 2c 20 31  pDeleteParent, 1
14670 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b  , pNode->iNode);
14680 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
14690 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 50  pRtree->pDeleteP
146a0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 53 51  arent);.  if( SQ
146b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
146c0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
146d0 72 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65  ree->pDeletePare
146e0 6e 74 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nt)) ){.    retu
146f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 0a 20 20  rn rc;.  }.  .  
14700 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e 6f  /* Remove the no
14710 64 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  de from the in-m
14720 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
14730 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
14740 6f 0a 20 20 2a 2a 20 74 68 65 20 52 74 72 65 65  o.  ** the Rtree
14750 2e 70 44 65 6c 65 74 65 64 20 6c 69 73 74 2e 20  .pDeleted list. 
14760 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 69 6c  Its contents wil
14770 6c 20 62 65 20 72 65 2d 69 6e 73 65 72 74 65 64  l be re-inserted
14780 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 2a 2f 0a   later on..  */.
14790 20 20 6e 6f 64 65 48 61 73 68 44 65 6c 65 74 65    nodeHashDelete
147a0 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b  (pRtree, pNode);
147b0 0a 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20  .  pNode->iNode 
147c0 3d 20 69 48 65 69 67 68 74 3b 0a 20 20 70 4e 6f  = iHeight;.  pNo
147d0 64 65 2d 3e 70 4e 65 78 74 20 3d 20 70 52 74 72  de->pNext = pRtr
147e0 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b 0a 20 20  ee->pDeleted;.  
147f0 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pNode->nRef++;. 
14800 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65   pRtree->pDelete
14810 64 20 3d 20 70 4e 6f 64 65 3b 0a 0a 20 20 72 65  d = pNode;..  re
14820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14830 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  }..static int fi
14840 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 52 74 72  xBoundingBox(Rtr
14850 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65  ee *pRtree, Rtre
14860 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  eNode *pNode){. 
14870 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72   RtreeNode *pPar
14880 65 6e 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61  ent = pNode->pPa
14890 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rent;.  int rc =
148a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 20 20 69   SQLITE_OK; .  i
148b0 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
148c0 20 20 69 6e 74 20 69 69 3b 20 0a 20 20 20 20 69    int ii; .    i
148d0 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c  nt nCell = NCELL
148e0 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52 74 72  (pNode);.    Rtr
148f0 65 65 43 65 6c 6c 20 62 6f 78 3b 20 20 20 20 20  eeCell box;     
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 2f 2a 20 42 6f 75 6e 64 69         /* Boundi
14920 6e 67 20 62 6f 78 20 66 6f 72 20 70 4e 6f 64 65  ng box for pNode
14930 20 2a 2f 0a 20 20 20 20 6e 6f 64 65 47 65 74 43   */.    nodeGetC
14940 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
14950 65 2c 20 30 2c 20 26 62 6f 78 29 3b 0a 20 20 20  e, 0, &box);.   
14960 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43   for(ii=1; ii<nC
14970 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ell; ii++){.    
14980 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c    RtreeCell cell
14990 3b 0a 20 20 20 20 20 20 6e 6f 64 65 47 65 74 43  ;.      nodeGetC
149a0 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ell(pRtree, pNod
149b0 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a 20  e, ii, &cell);. 
149c0 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70       cellUnion(p
149d0 52 74 72 65 65 2c 20 26 62 6f 78 2c 20 26 63 65  Rtree, &box, &ce
149e0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ll);.    }.    b
149f0 6f 78 2e 69 52 6f 77 69 64 20 3d 20 70 4e 6f 64  ox.iRowid = pNod
14a00 65 2d 3e 69 4e 6f 64 65 3b 0a 20 20 20 20 72 63  e->iNode;.    rc
14a10 20 3d 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64   = nodeParentInd
14a20 65 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ex(pRtree, pNode
14a30 2c 20 26 69 69 29 3b 0a 20 20 20 20 69 66 28 20  , &ii);.    if( 
14a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14a50 0a 20 20 20 20 20 20 6e 6f 64 65 4f 76 65 72 77  .      nodeOverw
14a60 72 69 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c  riteCell(pRtree,
14a70 20 70 50 61 72 65 6e 74 2c 20 26 62 6f 78 2c 20   pParent, &box, 
14a80 69 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ii);.      rc = 
14a90 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 70  fixBoundingBox(p
14aa0 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 29 3b  Rtree, pParent);
14ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14ad0 20 44 65 6c 65 74 65 20 74 68 65 20 63 65 6c 6c   Delete the cell
14ae0 20 61 74 20 69 6e 64 65 78 20 69 43 65 6c 6c 20   at index iCell 
14af0 6f 66 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 41  of node pNode. A
14b00 66 74 65 72 20 72 65 6d 6f 76 69 6e 67 20 74 68  fter removing th
14b10 65 0a 2a 2a 20 63 65 6c 6c 2c 20 61 64 6a 75 73  e.** cell, adjus
14b20 74 20 74 68 65 20 72 2d 74 72 65 65 20 64 61 74  t the r-tree dat
14b30 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 72  a structure if r
14b40 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
14b50 69 63 20 69 6e 74 20 64 65 6c 65 74 65 43 65 6c  ic int deleteCel
14b60 6c 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c  l(Rtree *pRtree,
14b70 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
14b80 65 2c 20 69 6e 74 20 69 43 65 6c 6c 2c 20 69 6e  e, int iCell, in
14b90 74 20 69 48 65 69 67 68 74 29 7b 0a 20 20 52 74  t iHeight){.  Rt
14ba0 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
14bb0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14bc0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
14bd0 63 20 3d 20 66 69 78 4c 65 61 66 50 61 72 65 6e  c = fixLeafParen
14be0 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  t(pRtree, pNode)
14bf0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14c00 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  rc;.  }..  /* Re
14c10 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 66 72  move the cell fr
14c20 6f 6d 20 74 68 65 20 6e 6f 64 65 2e 20 54 68 69  om the node. Thi
14c30 73 20 63 61 6c 6c 20 6a 75 73 74 20 6d 6f 76 65  s call just move
14c40 73 20 62 79 74 65 73 20 61 72 6f 75 6e 64 0a 20  s bytes around. 
14c50 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
14c60 79 20 6e 6f 64 65 20 69 6d 61 67 65 2c 20 73 6f  y node image, so
14c70 20 69 74 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e   it cannot fail.
14c80 0a 20 20 2a 2f 0a 20 20 6e 6f 64 65 44 65 6c 65  .  */.  nodeDele
14c90 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  teCell(pRtree, p
14ca0 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b 0a 0a 20  Node, iCell);.. 
14cb0 20 2f 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20   /* If the node 
14cc0 69 73 20 6e 6f 74 20 74 68 65 20 74 72 65 65 20  is not the tree 
14cd0 72 6f 6f 74 20 61 6e 64 20 6e 6f 77 20 68 61 73  root and now has
14ce0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6d   less than the m
14cf0 69 6e 69 6d 75 6d 0a 20 20 2a 2a 20 6e 75 6d 62  inimum.  ** numb
14d00 65 72 20 6f 66 20 63 65 6c 6c 73 2c 20 72 65 6d  er of cells, rem
14d10 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
14d20 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
14d30 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
14d40 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72   cell in the par
14d50 65 6e 74 20 6e 6f 64 65 20 73 6f 20 74 68 61 74  ent node so that
14d60 20 69 74 20 74 69 67 68 74 6c 79 20 63 6f 6e 74   it tightly cont
14d70 61 69 6e 73 20 74 68 65 20 75 70 64 61 74 65 64  ains the updated
14d80 0a 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 2a 2f  .  ** node..  */
14d90 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f  .  pParent = pNo
14da0 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  de->pParent;.  a
14db0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 7c  ssert( pParent |
14dc0 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d  | pNode->iNode==
14dd0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 65  1 );.  if( pPare
14de0 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 4e 43  nt ){.    if( NC
14df0 45 4c 4c 28 70 4e 6f 64 65 29 3c 52 54 52 45 45  ELL(pNode)<RTREE
14e00 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65 65  _MINCELLS(pRtree
14e10 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
14e20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52 74 72 65  removeNode(pRtre
14e30 65 2c 20 70 4e 6f 64 65 2c 20 69 48 65 69 67 68  e, pNode, iHeigh
14e40 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
14e50 20 20 20 20 20 72 63 20 3d 20 66 69 78 42 6f 75       rc = fixBou
14e60 6e 64 69 6e 67 42 6f 78 28 70 52 74 72 65 65 2c  ndingBox(pRtree,
14e70 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20   pNode);.    }. 
14e80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
14e90 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 52  .}..static int R
14ea0 65 69 6e 73 65 72 74 28 0a 20 20 52 74 72 65 65  einsert(.  Rtree
14eb0 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72   *pRtree, .  Rtr
14ec0 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a  eeNode *pNode, .
14ed0 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65    RtreeCell *pCe
14ee0 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67  ll, .  int iHeig
14ef0 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a 61 4f 72  ht.){.  int *aOr
14f00 64 65 72 3b 0a 20 20 69 6e 74 20 2a 61 53 70 61  der;.  int *aSpa
14f10 72 65 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  re;.  RtreeCell 
14f20 2a 61 43 65 6c 6c 3b 0a 20 20 52 74 72 65 65 44  *aCell;.  RtreeD
14f30 56 61 6c 75 65 20 2a 61 44 69 73 74 61 6e 63 65  Value *aDistance
14f40 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
14f50 20 52 74 72 65 65 44 56 61 6c 75 65 20 61 43 65   RtreeDValue aCe
14f60 6e 74 65 72 43 6f 6f 72 64 5b 52 54 52 45 45 5f  nterCoord[RTREE_
14f70 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 5d 3b  MAX_DIMENSIONS];
14f80 0a 20 20 69 6e 74 20 69 44 69 6d 3b 0a 20 20 69  .  int iDim;.  i
14f90 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
14fa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14fb0 6e 74 20 6e 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  nt n;..  memset(
14fc0 61 43 65 6e 74 65 72 43 6f 6f 72 64 2c 20 30 2c  aCenterCoord, 0,
14fd0 20 73 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61   sizeof(RtreeDVa
14fe0 6c 75 65 29 2a 52 54 52 45 45 5f 4d 41 58 5f 44  lue)*RTREE_MAX_D
14ff0 49 4d 45 4e 53 49 4f 4e 53 29 3b 0a 0a 20 20 6e  IMENSIONS);..  n
15000 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
15010 64 65 29 2b 31 3b 0a 20 20 6e 20 3d 20 28 6e 43  de)+1;.  n = (nC
15020 65 6c 6c 2b 31 29 26 28 7e 31 29 3b 0a 0a 20 20  ell+1)&(~1);..  
15030 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
15040 62 75 66 66 65 72 73 20 75 73 65 64 20 62 79 20  buffers used by 
15050 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
15060 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
15070 73 0a 20 20 2a 2a 20 72 65 6c 69 6e 71 75 69 73  s.  ** relinquis
15080 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
15090 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
150a0 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c 6c 20 3d  ..  */.  aCell =
150b0 20 28 52 74 72 65 65 43 65 6c 6c 20 2a 29 73 71   (RtreeCell *)sq
150c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
150d0 20 2a 20 28 0a 20 20 20 20 73 69 7a 65 6f 66 28   * (.    sizeof(
150e0 52 74 72 65 65 43 65 6c 6c 29 20 20 20 20 20 2b  RtreeCell)     +
150f0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43 65 6c           /* aCel
15100 6c 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73  l array */.    s
15110 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20  izeof(int)      
15120 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 2f       +         /
15130 2a 20 61 4f 72 64 65 72 20 61 72 72 61 79 20 2a  * aOrder array *
15140 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74  /.    sizeof(int
15150 29 20 20 20 20 20 20 20 20 20 20 20 2b 20 20 20  )           +   
15160 20 20 20 20 20 20 2f 2a 20 61 53 70 61 72 65 20        /* aSpare 
15170 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73 69 7a  array */.    siz
15180 65 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29  eof(RtreeDValue)
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151a0 61 44 69 73 74 61 6e 63 65 20 61 72 72 61 79 20  aDistance array 
151b0 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 21  */.  ));.  if( !
151c0 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  aCell ){.    ret
151d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
151e0 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65 72 20 20  ;.  }.  aOrder  
151f0 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 43 65 6c    = (int *)&aCel
15200 6c 5b 6e 5d 3b 0a 20 20 61 53 70 61 72 65 20 20  l[n];.  aSpare  
15210 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 4f 72 64    = (int *)&aOrd
15220 65 72 5b 6e 5d 3b 0a 20 20 61 44 69 73 74 61 6e  er[n];.  aDistan
15230 63 65 20 3d 20 28 52 74 72 65 65 44 56 61 6c 75  ce = (RtreeDValu
15240 65 20 2a 29 26 61 53 70 61 72 65 5b 6e 5d 3b 0a  e *)&aSpare[n];.
15250 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
15260 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  nCell; ii++){.  
15270 20 20 69 66 28 20 69 69 3d 3d 28 6e 43 65 6c 6c    if( ii==(nCell
15280 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  -1) ){.      mem
15290 63 70 79 28 26 61 43 65 6c 6c 5b 69 69 5d 2c 20  cpy(&aCell[ii], 
152a0 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28 52 74  pCell, sizeof(Rt
152b0 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20 20 7d  reeCell));.    }
152c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 6f 64 65  else{.      node
152d0 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
152e0 70 4e 6f 64 65 2c 20 69 69 2c 20 26 61 43 65 6c  pNode, ii, &aCel
152f0 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  l[ii]);.    }.  
15300 20 20 61 4f 72 64 65 72 5b 69 69 5d 20 3d 20 69    aOrder[ii] = i
15310 69 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d 3d  i;.    for(iDim=
15320 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d 3e  0; iDim<pRtree->
15330 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a 20  nDim; iDim++){. 
15340 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f 6f 72       aCenterCoor
15350 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f 4f 52  d[iDim] += DCOOR
15360 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
15370 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20  rd[iDim*2]);.   
15380 20 20 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b     aCenterCoord[
15390 69 44 69 6d 5d 20 2b 3d 20 44 43 4f 4f 52 44 28  iDim] += DCOORD(
153a0 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64  aCell[ii].aCoord
153b0 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a 20 20 20  [iDim*2+1]);.   
153c0 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 44 69   }.  }.  for(iDi
153d0 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65  m=0; iDim<pRtree
153e0 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b  ->nDim; iDim++){
153f0 0a 20 20 20 20 61 43 65 6e 74 65 72 43 6f 6f 72  .    aCenterCoor
15400 64 5b 69 44 69 6d 5d 20 3d 20 28 61 43 65 6e 74  d[iDim] = (aCent
15410 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 2f 28 6e  erCoord[iDim]/(n
15420 43 65 6c 6c 2a 28 52 74 72 65 65 44 56 61 6c 75  Cell*(RtreeDValu
15430 65 29 32 29 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  e)2));.  }..  fo
15440 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c  r(ii=0; ii<nCell
15450 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61 44 69  ; ii++){.    aDi
15460 73 74 61 6e 63 65 5b 69 69 5d 20 3d 20 52 54 52  stance[ii] = RTR
15470 45 45 5f 5a 45 52 4f 3b 0a 20 20 20 20 66 6f 72  EE_ZERO;.    for
15480 28 69 44 69 6d 3d 30 3b 20 69 44 69 6d 3c 70 52  (iDim=0; iDim<pR
15490 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d  tree->nDim; iDim
154a0 2b 2b 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65  ++){.      Rtree
154b0 44 56 61 6c 75 65 20 63 6f 6f 72 64 20 3d 20 28  DValue coord = (
154c0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d  DCOORD(aCell[ii]
154d0 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 2b 31  .aCoord[iDim*2+1
154e0 5d 29 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20  ]) - .          
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 44 43 4f 4f 52 44 28 61 43 65 6c       DCOORD(aCel
15510 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  l[ii].aCoord[iDi
15520 6d 2a 32 5d 29 29 3b 0a 20 20 20 20 20 20 61 44  m*2]));.      aD
15530 69 73 74 61 6e 63 65 5b 69 69 5d 20 2b 3d 20 28  istance[ii] += (
15540 63 6f 6f 72 64 2d 61 43 65 6e 74 65 72 43 6f 6f  coord-aCenterCoo
15550 72 64 5b 69 44 69 6d 5d 29 2a 28 63 6f 6f 72 64  rd[iDim])*(coord
15560 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44  -aCenterCoord[iD
15570 69 6d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  im]);.    }.  }.
15580 0a 20 20 53 6f 72 74 42 79 44 69 73 74 61 6e 63  .  SortByDistanc
15590 65 28 61 4f 72 64 65 72 2c 20 6e 43 65 6c 6c 2c  e(aOrder, nCell,
155a0 20 61 44 69 73 74 61 6e 63 65 2c 20 61 53 70 61   aDistance, aSpa
155b0 72 65 29 3b 0a 20 20 6e 6f 64 65 5a 65 72 6f 28  re);.  nodeZero(
155c0 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a  pRtree, pNode);.
155d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d  .  for(ii=0; rc=
155e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
155f0 3c 28 6e 43 65 6c 6c 2d 28 52 54 52 45 45 5f 4d  <(nCell-(RTREE_M
15600 49 4e 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2b  INCELLS(pRtree)+
15610 31 29 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  1)); ii++){.    
15620 52 74 72 65 65 43 65 6c 6c 20 2a 70 20 3d 20 26  RtreeCell *p = &
15630 61 43 65 6c 6c 5b 61 4f 72 64 65 72 5b 69 69 5d  aCell[aOrder[ii]
15640 5d 3b 0a 20 20 20 20 6e 6f 64 65 49 6e 73 65 72  ];.    nodeInser
15650 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e  tCell(pRtree, pN
15660 6f 64 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ode, p);.    if(
15670 20 70 2d 3e 69 52 6f 77 69 64 3d 3d 70 43 65 6c   p->iRowid==pCel
15680 6c 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  l->iRowid ){.   
15690 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d     if( iHeight==
156a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
156b0 3d 20 72 6f 77 69 64 57 72 69 74 65 28 70 52 74  = rowidWrite(pRt
156c0 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69 64 2c 20  ree, p->iRowid, 
156d0 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20  pNode->iNode);. 
156e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
156f0 20 20 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57      rc = parentW
15700 72 69 74 65 28 70 52 74 72 65 65 2c 20 70 2d 3e  rite(pRtree, p->
15710 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d 3e 69  iRowid, pNode->i
15720 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Node);.      }. 
15730 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
15740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15750 20 20 20 20 72 63 20 3d 20 66 69 78 42 6f 75 6e      rc = fixBoun
15760 64 69 6e 67 42 6f 78 28 70 52 74 72 65 65 2c 20  dingBox(pRtree, 
15770 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  pNode);.  }.  fo
15780 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
15790 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20 69  K && ii<nCell; i
157a0 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e  i++){.    /* Fin
157b0 64 20 61 20 6e 6f 64 65 20 74 6f 20 73 74 6f 72  d a node to stor
157c0 65 20 74 68 69 73 20 63 65 6c 6c 20 69 6e 2e 20  e this cell in. 
157d0 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 63 75 72  pNode->iNode cur
157e0 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a  rently contains.
157f0 20 20 20 20 2a 2a 20 74 68 65 20 68 65 69 67 68      ** the heigh
15800 74 20 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65  t of the sub-tre
15810 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  e headed by the 
15820 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
15830 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73   RtreeNode *pIns
15840 65 72 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65  ert;.    RtreeCe
15850 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c 6c 5b 61  ll *p = &aCell[a
15860 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20 20 20 20  Order[ii]];.    
15870 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28  rc = ChooseLeaf(
15880 70 52 74 72 65 65 2c 20 70 2c 20 69 48 65 69 67  pRtree, p, iHeig
15890 68 74 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a 20  ht, &pInsert);. 
158a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
158b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
158c0 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
158d0 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c  = rtreeInsertCel
158e0 6c 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72  l(pRtree, pInser
158f0 74 2c 20 70 2c 20 69 48 65 69 67 68 74 29 3b 0a  t, p, iHeight);.
15900 20 20 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65        rc2 = node
15910 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
15920 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
15930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15940 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
15950 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
15960 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
15970 74 65 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b  te3_free(aCell);
15980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15990 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 65  ./*.** Insert ce
159a0 6c 6c 20 70 43 65 6c 6c 20 69 6e 74 6f 20 6e 6f  ll pCell into no
159b0 64 65 20 70 4e 6f 64 65 2e 20 4e 6f 64 65 20 70  de pNode. Node p
159c0 4e 6f 64 65 20 69 73 20 74 68 65 20 68 65 61 64  Node is the head
159d0 20 6f 66 20 61 20 0a 2a 2a 20 73 75 62 74 72 65   of a .** subtre
159e0 65 20 69 48 65 69 67 68 74 20 68 69 67 68 20 28  e iHeight high (
159f0 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
15a00 69 48 65 69 67 68 74 3d 3d 30 29 2e 0a 2a 2f 0a  iHeight==0)..*/.
15a10 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
15a20 49 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 52 74  InsertCell(.  Rt
15a30 72 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52  ree *pRtree,.  R
15a40 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
15a50 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43  .  RtreeCell *pC
15a60 65 6c 6c 2c 0a 20 20 69 6e 74 20 69 48 65 69 67  ell,.  int iHeig
15a70 68 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ht.){.  int rc =
15a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
15a90 28 20 69 48 65 69 67 68 74 3e 30 20 29 7b 0a 20  ( iHeight>0 ){. 
15aa0 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 43     RtreeNode *pC
15ab0 68 69 6c 64 20 3d 20 6e 6f 64 65 48 61 73 68 4c  hild = nodeHashL
15ac0 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20 70 43  ookup(pRtree, pC
15ad0 65 6c 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ell->iRowid);.  
15ae0 20 20 69 66 28 20 70 43 68 69 6c 64 20 29 7b 0a    if( pChild ){.
15af0 20 20 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73        nodeReleas
15b00 65 28 70 52 74 72 65 65 2c 20 70 43 68 69 6c 64  e(pRtree, pChild
15b10 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
15b20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63 65 28    nodeReference(
15b30 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 43  pNode);.      pC
15b40 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 20 3d 20  hild->pParent = 
15b50 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNode;.    }.  }
15b60 0a 20 20 69 66 28 20 6e 6f 64 65 49 6e 73 65 72  .  if( nodeInser
15b70 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e  tCell(pRtree, pN
15b80 6f 64 65 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 20  ode, pCell) ){. 
15b90 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3c 3d     if( iHeight<=
15ba0 70 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72  pRtree->iReinser
15bb0 74 48 65 69 67 68 74 20 7c 7c 20 70 4e 6f 64 65  tHeight || pNode
15bc0 2d 3e 69 4e 6f 64 65 3d 3d 31 29 7b 0a 20 20 20  ->iNode==1){.   
15bd0 20 20 20 72 63 20 3d 20 53 70 6c 69 74 4e 6f 64     rc = SplitNod
15be0 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  e(pRtree, pNode,
15bf0 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68 74 29   pCell, iHeight)
15c00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15c10 20 20 20 70 52 74 72 65 65 2d 3e 69 52 65 69 6e     pRtree->iRein
15c20 73 65 72 74 48 65 69 67 68 74 20 3d 20 69 48 65  sertHeight = iHe
15c30 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
15c40 20 52 65 69 6e 73 65 72 74 28 70 52 74 72 65 65   Reinsert(pRtree
15c50 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c 2c 20  , pNode, pCell, 
15c60 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  iHeight);.    }.
15c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15c80 3d 20 41 64 6a 75 73 74 54 72 65 65 28 70 52 74  = AdjustTree(pRt
15c90 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c  ree, pNode, pCel
15ca0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
15cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15cc0 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d     if( iHeight==
15cd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
15ce0 3d 20 72 6f 77 69 64 57 72 69 74 65 28 70 52 74  = rowidWrite(pRt
15cf0 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f 77  ree, pCell->iRow
15d00 69 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  id, pNode->iNode
15d10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 72          rc = par
15d30 65 6e 74 57 72 69 74 65 28 70 52 74 72 65 65 2c  entWrite(pRtree,
15d40 20 70 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20   pCell->iRowid, 
15d50 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20  pNode->iNode);. 
15d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15d70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15d80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 69 6e  .static int rein
15d90 73 65 72 74 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  sertNodeContent(
15da0 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
15db0 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29  treeNode *pNode)
15dc0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
15dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15de0 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  ;.  int nCell = 
15df0 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 0a 20  NCELL(pNode);.. 
15e00 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
15e10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
15e20 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Cell; ii++){.   
15e30 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 49 6e 73   RtreeNode *pIns
15e40 65 72 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65  ert;.    RtreeCe
15e50 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 6e 6f 64  ll cell;.    nod
15e60 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c  eGetCell(pRtree,
15e70 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c   pNode, ii, &cel
15e80 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  l);..    /* Find
15e90 20 61 20 6e 6f 64 65 20 74 6f 20 73 74 6f 72 65   a node to store
15ea0 20 74 68 69 73 20 63 65 6c 6c 20 69 6e 2e 20 70   this cell in. p
15eb0 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 63 75 72 72  Node->iNode curr
15ec0 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 20  ently contains. 
15ed0 20 20 20 2a 2a 20 74 68 65 20 68 65 69 67 68 74     ** the height
15ee0 20 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65   of the sub-tree
15ef0 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63   headed by the c
15f00 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15f10 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28  rc = ChooseLeaf(
15f20 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 28  pRtree, &cell, (
15f30 69 6e 74 29 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65  int)pNode->iNode
15f40 2c 20 26 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  , &pInsert);.   
15f50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
15f70 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
15f80 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c 28  rtreeInsertCell(
15f90 70 52 74 72 65 65 2c 20 70 49 6e 73 65 72 74 2c  pRtree, pInsert,
15fa0 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29 70 4e 6f   &cell, (int)pNo
15fb0 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20  de->iNode);.    
15fc0 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65    rc2 = nodeRele
15fd0 61 73 65 28 70 52 74 72 65 65 2c 20 70 49 6e 73  ase(pRtree, pIns
15fe0 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ert);.      if( 
15ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
16010 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
16020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6c 65 63  ;.}../*.** Selec
16040 74 20 61 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  t a currently un
16050 75 73 65 64 20 72 6f 77 69 64 20 66 6f 72 20 61  used rowid for a
16060 20 6e 65 77 20 72 2d 74 72 65 65 20 72 65 63 6f   new r-tree reco
16070 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
16080 74 20 72 74 72 65 65 4e 65 77 52 6f 77 69 64 28  t rtreeNewRowid(
16090 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69  Rtree *pRtree, i
160a0 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20  64 *piRowid){.  
160b0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
160c0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52 74 72  3_bind_null(pRtr
160d0 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 2c  ee->pWriteRowid,
160e0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   1);.  sqlite3_b
160f0 69 6e 64 5f 6e 75 6c 6c 28 70 52 74 72 65 65 2d  ind_null(pRtree-
16100 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20 32 29  >pWriteRowid, 2)
16110 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
16120 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
16130 6f 77 69 64 29 3b 0a 20 20 72 63 20 3d 20 73 71  owid);.  rc = sq
16140 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72  lite3_reset(pRtr
16150 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29  ee->pWriteRowid)
16160 3b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 73  ;.  *piRowid = s
16170 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
16180 72 74 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d  rt_rowid(pRtree-
16190 3e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >db);.  return r
161a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  c;.}../*.** Remo
161b0 76 65 20 74 68 65 20 65 6e 74 72 79 20 77 69 74  ve the entry wit
161c0 68 20 72 6f 77 69 64 3d 69 44 65 6c 65 74 65 20  h rowid=iDelete 
161d0 66 72 6f 6d 20 74 68 65 20 72 2d 74 72 65 65 20  from the r-tree 
161e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
161f0 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 44 65  atic int rtreeDe
16200 6c 65 74 65 52 6f 77 69 64 28 52 74 72 65 65 20  leteRowid(Rtree 
16210 2a 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65 33  *pRtree, sqlite3
16220 5f 69 6e 74 36 34 20 69 44 65 6c 65 74 65 29 7b  _int64 iDelete){
16230 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16260 65 20 2a 2f 0a 20 20 52 74 72 65 65 4e 6f 64 65  e */.  RtreeNode
16270 20 2a 70 4c 65 61 66 20 3d 20 30 3b 20 20 20 20   *pLeaf = 0;    
16280 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6e         /* Leaf n
16290 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  ode containing r
162a0 65 63 6f 72 64 20 69 44 65 6c 65 74 65 20 2a 2f  ecord iDelete */
162b0 0a 20 20 69 6e 74 20 69 43 65 6c 6c 3b 20 20 20  .  int iCell;   
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 69     /* Index of i
162e0 44 65 6c 65 74 65 20 63 65 6c 6c 20 69 6e 20 70  Delete cell in p
162f0 4c 65 61 66 20 2a 2f 0a 20 20 52 74 72 65 65 4e  Leaf */.  RtreeN
16300 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 30 3b 20  ode *pRoot = 0; 
16310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16320 74 20 6e 6f 64 65 20 6f 66 20 72 74 72 65 65 20  t node of rtree 
16330 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 0a 20  structure */... 
16340 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66   /* Obtain a ref
16350 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 6f  erence to the ro
16360 6f 74 20 6e 6f 64 65 20 74 6f 20 69 6e 69 74 69  ot node to initi
16370 61 6c 69 7a 65 20 52 74 72 65 65 2e 69 44 65 70  alize Rtree.iDep
16380 74 68 20 2a 2f 0a 20 20 72 63 20 3d 20 6e 6f 64  th */.  rc = nod
16390 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c  eAcquire(pRtree,
163a0 20 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29 3b 0a   1, 0, &pRoot);.
163b0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72  .  /* Obtain a r
163c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
163d0 6c 65 61 66 20 6e 6f 64 65 20 74 68 61 74 20 63  leaf node that c
163e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
163f0 79 20 0a 20 20 2a 2a 20 61 62 6f 75 74 20 74 6f  y .  ** about to
16400 20 62 65 20 64 65 6c 65 74 65 64 2e 20 0a 20 20   be deleted. .  
16410 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
16420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16430 20 3d 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28   = findLeafNode(
16440 70 52 74 72 65 65 2c 20 69 44 65 6c 65 74 65 2c  pRtree, iDelete,
16450 20 26 70 4c 65 61 66 2c 20 30 29 3b 0a 20 20 7d   &pLeaf, 0);.  }
16460 0a 0a 23 69 66 64 65 66 20 43 4f 52 52 55 50 54  ..#ifdef CORRUPT
16470 5f 44 42 0a 20 20 61 73 73 65 72 74 28 20 70 4c  _DB.  assert( pL
16480 65 61 66 21 3d 30 20 7c 7c 20 72 63 21 3d 53 51  eaf!=0 || rc!=SQ
16490 4c 49 54 45 5f 4f 4b 20 7c 7c 20 43 4f 52 52 55  LITE_OK || CORRU
164a0 50 54 5f 44 42 20 29 3b 0a 23 65 6e 64 69 66 0a  PT_DB );.#endif.
164b0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
164c0 20 63 65 6c 6c 20 69 6e 20 71 75 65 73 74 69 6f   cell in questio
164d0 6e 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20  n from the leaf 
164e0 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72  node. */.  if( r
164f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16500 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  pLeaf ){.    int
16510 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 6e   rc2;.    rc = n
16520 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52  odeRowidIndex(pR
16530 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 69 44 65  tree, pLeaf, iDe
16540 6c 65 74 65 2c 20 26 69 43 65 6c 6c 29 3b 0a 20  lete, &iCell);. 
16550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
16570 20 3d 20 64 65 6c 65 74 65 43 65 6c 6c 28 70 52   = deleteCell(pR
16580 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 69 43 65  tree, pLeaf, iCe
16590 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
165a0 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65    rc2 = nodeRele
165b0 61 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65 61  ase(pRtree, pLea
165c0 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  f);.    if( rc==
165d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
165e0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
165f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c   }.  }..  /* Del
16600 65 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ete the correspo
16610 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
16620 68 65 20 3c 72 74 72 65 65 3e 5f 72 6f 77 69 64  he <rtree>_rowid
16630 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28   table. */.  if(
16640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
16660 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  nd_int64(pRtree-
16670 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 2c 20 31  >pDeleteRowid, 1
16680 2c 20 69 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  , iDelete);.    
16690 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74  sqlite3_step(pRt
166a0 72 65 65 2d 3e 70 44 65 6c 65 74 65 52 6f 77 69  ree->pDeleteRowi
166b0 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  d);.    rc = sql
166c0 69 74 65 33 5f 72 65 73 65 74 28 70 52 74 72 65  ite3_reset(pRtre
166d0 65 2d 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 29  e->pDeleteRowid)
166e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
166f0 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f  k if the root no
16700 64 65 20 6e 6f 77 20 68 61 73 20 65 78 61 63 74  de now has exact
16710 6c 79 20 6f 6e 65 20 63 68 69 6c 64 2e 20 49 66  ly one child. If
16720 20 73 6f 2c 20 72 65 6d 6f 76 65 0a 20 20 2a 2a   so, remove.  **
16730 20 69 74 2c 20 73 63 68 65 64 75 6c 65 20 74 68   it, schedule th
16740 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
16750 65 20 63 68 69 6c 64 20 66 6f 72 20 72 65 69 6e  e child for rein
16760 73 65 72 74 69 6f 6e 20 61 6e 64 20 0a 20 20 2a  sertion and .  *
16770 2a 20 72 65 64 75 63 65 20 74 68 65 20 74 72 65  * reduce the tre
16780 65 20 68 65 69 67 68 74 20 62 79 20 6f 6e 65 2e  e height by one.
16790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
167a0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
167b0 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
167c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 69  tents of the chi
167d0 6c 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  ld into.  ** the
167e0 20 72 6f 6f 74 20 6e 6f 64 65 20 28 74 68 65 20   root node (the 
167f0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 47  operation that G
16800 75 74 6d 61 6e 27 73 20 70 61 70 65 72 20 73 61  utman's paper sa
16810 79 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 0a 20  ys to perform . 
16820 20 2a 2a 20 69 6e 20 74 68 69 73 20 73 63 65 6e   ** in this scen
16830 61 72 69 6f 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  ario)..  */.  if
16840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16850 26 26 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74  && pRtree->iDept
16860 68 3e 30 20 26 26 20 4e 43 45 4c 4c 28 70 52 6f  h>0 && NCELL(pRo
16870 6f 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e  ot)==1 ){.    in
16880 74 20 72 63 32 3b 0a 20 20 20 20 52 74 72 65 65  t rc2;.    Rtree
16890 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Node *pChild = 0
168a0 3b 0a 20 20 20 20 69 36 34 20 69 43 68 69 6c 64  ;.    i64 iChild
168b0 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28   = nodeGetRowid(
168c0 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 2c 20 30  pRtree, pRoot, 0
168d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  );.    rc = node
168e0 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c 20  Acquire(pRtree, 
168f0 69 43 68 69 6c 64 2c 20 70 52 6f 6f 74 2c 20 26  iChild, pRoot, &
16900 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66 28  pChild);.    if(
16910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6d  {.      rc = rem
16930 6f 76 65 4e 6f 64 65 28 70 52 74 72 65 65 2c 20  oveNode(pRtree, 
16940 70 43 68 69 6c 64 2c 20 70 52 74 72 65 65 2d 3e  pChild, pRtree->
16950 69 44 65 70 74 68 2d 31 29 3b 0a 20 20 20 20 7d  iDepth-1);.    }
16960 0a 20 20 20 20 72 63 32 20 3d 20 6e 6f 64 65 52  .    rc2 = nodeR
16970 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
16980 43 68 69 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  Child);.    if( 
16990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
169a0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 69 66  rc = rc2;.    if
169b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
169c0 29 7b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d  ){.      pRtree-
169d0 3e 69 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20  >iDepth--;.     
169e0 20 77 72 69 74 65 49 6e 74 31 36 28 70 52 6f 6f   writeInt16(pRoo
169f0 74 2d 3e 7a 44 61 74 61 2c 20 70 52 74 72 65 65  t->zData, pRtree
16a00 2d 3e 69 44 65 70 74 68 29 3b 0a 20 20 20 20 20  ->iDepth);.     
16a10 20 70 52 6f 6f 74 2d 3e 69 73 44 69 72 74 79 20   pRoot->isDirty 
16a20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
16a30 20 20 2f 2a 20 52 65 2d 69 6e 73 65 72 74 20 74    /* Re-insert t
16a40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
16a50 6e 79 20 75 6e 64 65 72 66 75 6c 6c 20 6e 6f 64  ny underfull nod
16a60 65 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  es removed from 
16a70 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20 66  the tree. */.  f
16a80 6f 72 28 70 4c 65 61 66 3d 70 52 74 72 65 65 2d  or(pLeaf=pRtree-
16a90 3e 70 44 65 6c 65 74 65 64 3b 20 70 4c 65 61 66  >pDeleted; pLeaf
16aa0 3b 20 70 4c 65 61 66 3d 70 52 74 72 65 65 2d 3e  ; pLeaf=pRtree->
16ab0 70 44 65 6c 65 74 65 64 29 7b 0a 20 20 20 20 69  pDeleted){.    i
16ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
16ae0 65 69 6e 73 65 72 74 4e 6f 64 65 43 6f 6e 74 65  einsertNodeConte
16af0 6e 74 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66  nt(pRtree, pLeaf
16b00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 74  );.    }.    pRt
16b10 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 20 3d 20  ree->pDeleted = 
16b20 70 4c 65 61 66 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLeaf->pNext;.  
16b30 20 20 70 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52    pRtree->nNodeR
16b40 65 66 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ef--;.    sqlite
16b50 33 5f 66 72 65 65 28 70 4c 65 61 66 29 3b 0a 20  3_free(pLeaf);. 
16b60 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65   }..  /* Release
16b70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
16b80 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  o the root node.
16b90 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
16ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16bb0 63 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28  c = nodeRelease(
16bc0 70 52 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a  pRtree, pRoot);.
16bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64    }else{.    nod
16be0 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
16bf0 20 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20   pRoot);.  }..  
16c00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16c10 0a 2a 2a 20 52 6f 75 6e 64 69 6e 67 20 63 6f 6e  .** Rounding con
16c20 73 74 61 6e 74 73 20 66 6f 72 20 66 6c 6f 61 74  stants for float
16c30 2d 3e 64 6f 75 62 6c 65 20 63 6f 6e 76 65 72 73  ->double convers
16c40 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ion..*/.#define 
16c50 52 4e 44 54 4f 57 41 52 44 53 20 20 28 31 2e 30  RNDTOWARDS  (1.0
16c60 20 2d 20 31 2e 30 2f 38 33 38 38 36 30 38 2e 30   - 1.0/8388608.0
16c70 29 20 20 2f 2a 20 52 6f 75 6e 64 20 74 6f 77 61  )  /* Round towa
16c80 72 64 73 20 7a 65 72 6f 20 2a 2f 0a 23 64 65 66  rds zero */.#def
16c90 69 6e 65 20 52 4e 44 41 57 41 59 20 20 20 20 20  ine RNDAWAY     
16ca0 28 31 2e 30 20 2b 20 31 2e 30 2f 38 33 38 38 36  (1.0 + 1.0/83886
16cb0 30 38 2e 30 29 20 20 2f 2a 20 52 6f 75 6e 64 20  08.0)  /* Round 
16cc0 61 77 61 79 20 66 72 6f 6d 20 7a 65 72 6f 20 2a  away from zero *
16cd0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
16ce0 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54  SQLITE_RTREE_INT
16cf0 5f 4f 4e 4c 59 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e  _ONLY)./*.** Con
16d00 76 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f  vert an sqlite3_
16d10 76 61 6c 75 65 20 69 6e 74 6f 20 61 6e 20 52 74  value into an Rt
16d20 72 65 65 56 61 6c 75 65 20 28 70 72 65 73 75 6d  reeValue (presum
16d30 61 62 6c 79 20 61 20 66 6c 6f 61 74 29 0a 2a 2a  ably a float).**
16d40 20 77 68 69 6c 65 20 74 61 6b 69 6e 67 20 63 61   while taking ca
16d50 72 65 20 74 6f 20 72 6f 75 6e 64 20 74 6f 77 61  re to round towa
16d60 72 64 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70  rd negative or p
16d70 6f 73 69 74 69 76 65 2c 20 72 65 73 70 65 63 74  ositive, respect
16d80 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ively..*/.static
16d90 20 52 74 72 65 65 56 61 6c 75 65 20 72 74 72 65   RtreeValue rtre
16da0 65 56 61 6c 75 65 44 6f 77 6e 28 73 71 6c 69 74  eValueDown(sqlit
16db0 65 33 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20  e3_value *v){.  
16dc0 64 6f 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74  double d = sqlit
16dd0 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
16de0 76 29 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20  v);.  float f = 
16df0 28 66 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20  (float)d;.  if( 
16e00 66 3e 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28  f>d ){.    f = (
16e10 66 6c 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20  float)(d*(d<0 ? 
16e20 52 4e 44 41 57 41 59 20 3a 20 52 4e 44 54 4f 57  RNDAWAY : RNDTOW
16e30 41 52 44 53 29 29 3b 0a 20 20 7d 0a 20 20 72 65  ARDS));.  }.  re
16e40 74 75 72 6e 20 66 3b 0a 7d 0a 73 74 61 74 69 63  turn f;.}.static
16e50 20 52 74 72 65 65 56 61 6c 75 65 20 72 74 72 65   RtreeValue rtre
16e60 65 56 61 6c 75 65 55 70 28 73 71 6c 69 74 65 33  eValueUp(sqlite3
16e70 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f  _value *v){.  do
16e80 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33  uble d = sqlite3
16e90 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29  _value_double(v)
16ea0 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66  ;.  float f = (f
16eb0 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3c  loat)d;.  if( f<
16ec0 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c  d ){.    f = (fl
16ed0 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e  oat)(d*(d<0 ? RN
16ee0 44 54 4f 57 41 52 44 53 20 3a 20 52 4e 44 41 57  DTOWARDS : RNDAW
16ef0 41 59 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  AY));.  }.  retu
16f00 72 6e 20 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn f;.}.#endif /
16f10 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
16f20 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
16f30 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f  ) */../*.** A co
16f40 6e 73 74 72 61 69 6e 74 20 68 61 73 20 66 61 69  nstraint has fai
16f50 6c 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  led while insert
16f60 69 6e 67 20 61 20 72 6f 77 20 69 6e 74 6f 20 61  ing a row into a
16f70 6e 20 72 74 72 65 65 20 74 61 62 6c 65 2e 20 0a  n rtree table. .
16f80 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 4f  ** Assuming no O
16f90 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
16fa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
16fb0 65 74 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ets the error me
16fc0 73 73 61 67 65 20 0a 2a 2a 20 28 61 74 20 70 52  ssage .** (at pR
16fd0 74 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  tree->base.zErrM
16fe0 73 67 29 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  sg) to an approp
16ff0 72 69 61 74 65 20 76 61 6c 75 65 20 61 6e 64 20  riate value and 
17000 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54  returns.** SQLIT
17010 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a  E_CONSTRAINT..**
17020 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 43  .** Parameter iC
17030 6f 6c 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  ol is the index 
17040 6f 66 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  of the leftmost 
17050 63 6f 6c 75 6d 6e 20 69 6e 76 6f 6c 76 65 64 20  column involved 
17060 69 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 74 72  in the.** constr
17070 61 69 6e 74 20 66 61 69 6c 75 72 65 2e 20 49 66  aint failure. If
17080 20 69 74 20 69 73 20 30 2c 20 74 68 65 6e 20 74   it is 0, then t
17090 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  he constraint th
170a0 61 74 20 66 61 69 6c 65 64 20 69 73 0a 2a 2a 20  at failed is.** 
170b0 74 68 65 20 75 6e 69 71 75 65 20 63 6f 6e 73 74  the unique const
170c0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 69 64 20  raint on the id 
170d0 63 6f 6c 75 6d 6e 2e 20 4f 74 68 65 72 77 69 73  column. Otherwis
170e0 65 2c 20 69 74 20 69 73 20 74 68 65 20 72 74 72  e, it is the rtr
170f0 65 65 0a 2a 2a 20 28 63 31 3c 3d 63 32 29 20 63  ee.** (c1<=c2) c
17100 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
17110 75 6d 6e 73 20 69 43 6f 6c 20 61 6e 64 20 69 43  umns iCol and iC
17120 6f 6c 2b 31 20 74 68 61 74 20 68 61 73 20 66 61  ol+1 that has fa
17130 69 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iled..**.** If a
17140 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 53 51  n OOM occurs, SQ
17150 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
17160 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
17170 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  f SQLITE_CONSTRA
17180 49 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  INT..*/.static i
17190 6e 74 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69  nt rtreeConstrai
171a0 6e 74 45 72 72 6f 72 28 52 74 72 65 65 20 2a 70  ntError(Rtree *p
171b0 52 74 72 65 65 2c 20 69 6e 74 20 69 43 6f 6c 29  Rtree, int iCol)
171c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
171d0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
171e0 68 61 72 20 2a 7a 53 71 6c 3b 20 0a 20 20 69 6e  har *zSql; .  in
171f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
17200 20 69 43 6f 6c 3d 3d 30 20 7c 7c 20 69 43 6f 6c   iCol==0 || iCol
17210 25 32 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  %2 );.  zSql = s
17220 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17230 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 51  SELECT * FROM %Q
17240 2e 25 51 22 2c 20 70 52 74 72 65 65 2d 3e 7a 44  .%Q", pRtree->zD
17250 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65  b, pRtree->zName
17260 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  );.  if( zSql ){
17270 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17280 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 52 74  3_prepare_v2(pRt
17290 72 65 65 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  ree->db, zSql, -
172a0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
172b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
172c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
172d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
172e0 65 28 7a 53 71 6c 29 3b 0a 0a 20 20 69 66 28 20  e(zSql);..  if( 
172f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17300 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30  .    if( iCol==0
17310 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
17320 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c  char *zCol = sql
17330 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
17340 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
17350 20 20 70 52 74 72 65 65 2d 3e 62 61 73 65 2e 7a    pRtree->base.z
17360 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
17370 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
17380 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73      "UNIQUE cons
17390 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 25  traint failed: %
173a0 73 2e 25 73 22 2c 20 70 52 74 72 65 65 2d 3e 7a  s.%s", pRtree->z
173b0 4e 61 6d 65 2c 20 7a 43 6f 6c 0a 20 20 20 20 20  Name, zCol.     
173c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
173d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
173e0 2a 7a 43 6f 6c 31 20 3d 20 73 71 6c 69 74 65 33  *zCol1 = sqlite3
173f0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
17400 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
17410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17420 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l2 = sqlite3_col
17430 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
17440 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70  iCol+1);.      p
17450 52 74 72 65 65 2d 3e 62 61 73 65 2e 7a 45 72 72  Rtree->base.zErr
17460 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17470 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
17480 20 22 72 74 72 65 65 20 63 6f 6e 73 74 72 61 69   "rtree constrai
17490 6e 74 20 66 61 69 6c 65 64 3a 20 25 73 2e 28 25  nt failed: %s.(%
174a0 73 3c 3d 25 73 29 22 2c 20 70 52 74 72 65 65 2d  s<=%s)", pRtree-
174b0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 31 2c 20 7a  >zName, zCol1, z
174c0 43 6f 6c 32 0a 20 20 20 20 20 20 29 3b 0a 20 20  Col2.      );.  
174d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
174e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
174f0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63  t);.  return (rc
17500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 53 51  ==SQLITE_OK ? SQ
17510 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
17520 3a 20 72 63 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  : rc);.}..../*.*
17530 2a 20 54 68 65 20 78 55 70 64 61 74 65 20 6d 65  * The xUpdate me
17540 74 68 6f 64 20 66 6f 72 20 72 74 72 65 65 20 6d  thod for rtree m
17550 6f 64 75 6c 65 20 76 69 72 74 75 61 6c 20 74 61  odule virtual ta
17560 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
17570 69 6e 74 20 72 74 72 65 65 55 70 64 61 74 65 28  int rtreeUpdate(
17580 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
17590 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e 74 20 6e  *pVtab, .  int n
175a0 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65 33  Data, .  sqlite3
175b0 5f 76 61 6c 75 65 20 2a 2a 61 44 61 74 61 2c 20  _value **aData, 
175c0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
175d0 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 52 74 72  *pRowid.){.  Rtr
175e0 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
175f0 72 65 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69  ree *)pVtab;.  i
17600 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17610 4b 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63  K;.  RtreeCell c
17620 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
17630 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
17640 20 74 6f 20 69 6e 73 65 72 74 20 69 66 20 6e 44   to insert if nD
17650 61 74 61 3e 31 20 2a 2f 0a 20 20 69 6e 74 20 62  ata>1 */.  int b
17660 48 61 76 65 52 6f 77 69 64 20 3d 20 30 3b 20 20  HaveRowid = 0;  
17670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
17680 74 20 74 6f 20 31 20 61 66 74 65 72 20 6e 65 77  t to 1 after new
17690 20 72 6f 77 69 64 20 69 73 20 64 65 74 65 72 6d   rowid is determ
176a0 69 6e 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ined */..  if( p
176b0 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65 66 20  Rtree->nNodeRef 
176c0 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 61 62 6c 65  ){.    /* Unable
176d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
176e0 20 62 74 72 65 65 20 77 68 69 6c 65 20 61 6e 6f   btree while ano
176f0 74 68 65 72 20 63 75 72 73 6f 72 20 69 73 20 72  ther cursor is r
17700 65 61 64 69 6e 67 20 66 72 6f 6d 20 69 74 2c 0a  eading from it,.
17710 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65      ** since the
17720 20 77 72 69 74 65 20 6d 69 67 68 74 20 64 6f 20   write might do 
17730 61 20 72 65 62 61 6c 61 6e 63 65 20 77 68 69 63  a rebalance whic
17740 68 20 77 6f 75 6c 64 20 64 69 73 72 75 70 74 20  h would disrupt 
17750 74 68 65 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  the read.    ** 
17760 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 72  cursor. */.    r
17770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
17780 4b 45 44 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20  KED_VTAB;.  }.  
17790 72 74 72 65 65 52 65 66 65 72 65 6e 63 65 28 70  rtreeReference(p
177a0 52 74 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  Rtree);.  assert
177b0 28 6e 44 61 74 61 3e 3d 31 29 3b 0a 0a 20 20 63  (nData>=1);..  c
177c0 65 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 30 3b 20  ell.iRowid = 0; 
177d0 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 74 6f   /* Used only to
177e0 20 73 75 70 70 72 65 73 73 20 61 20 63 6f 6d 70   suppress a comp
177f0 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
17800 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74  .  /* Constraint
17810 20 68 61 6e 64 6c 69 6e 67 2e 20 41 20 77 72 69   handling. A wri
17820 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  te operation on 
17830 61 6e 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20  an r-tree table 
17840 6d 61 79 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  may return.  ** 
17850 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
17860 54 20 66 6f 72 20 74 77 6f 20 72 65 61 73 6f 6e  T for two reason
17870 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
17880 2e 20 41 20 64 75 70 6c 69 63 61 74 65 20 72 6f  . A duplicate ro
17890 77 69 64 20 76 61 6c 75 65 2c 20 6f 72 0a 20 20  wid value, or.  
178a0 2a 2a 20 20 20 32 2e 20 54 68 65 20 73 75 70 70  **   2. The supp
178b0 6c 69 65 64 20 64 61 74 61 20 76 69 6f 6c 61 74  lied data violat
178c0 65 73 20 74 68 65 20 22 78 32 3e 3d 78 31 22 20  es the "x2>=x1" 
178d0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2a  constraint..  **
178e0 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66 69 72  .  ** In the fir
178f0 73 74 20 63 61 73 65 2c 20 69 66 20 74 68 65 20  st case, if the 
17900 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69 6e  conflict-handlin
17910 67 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43  g mode is REPLAC
17920 45 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  E, then.  ** the
17930 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
17940 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
17950 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
17960 67 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  g. In the second
17970 0a 20 20 2a 2a 20 63 61 73 65 2c 20 53 51 4c 49  .  ** case, SQLI
17980 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6d 75  TE_CONSTRAINT mu
17990 73 74 20 62 65 20 72 65 74 75 72 6e 65 64 20 72  st be returned r
179a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
179b0 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 68  .  ** conflict-h
179c0 61 6e 64 6c 69 6e 67 20 6d 6f 64 65 20 73 70 65  andling mode spe
179d0 63 69 66 69 65 64 20 62 79 20 74 68 65 20 75 73  cified by the us
179e0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  er..  */.  if( n
179f0 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 69 6e  Data>1 ){.    in
17a00 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 6e  t ii;.    int nn
17a10 20 3d 20 6e 44 61 74 61 20 2d 20 34 3b 0a 0a 20   = nData - 4;.. 
17a20 20 20 20 69 66 28 20 6e 6e 20 3e 20 70 52 74 72     if( nn > pRtr
17a30 65 65 2d 3e 6e 44 69 6d 32 20 29 20 6e 6e 20 3d  ee->nDim2 ) nn =
17a40 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3b 0a   pRtree->nDim2;.
17a50 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
17a60 74 68 65 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b  the cell.aCoord[
17a70 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 69 72  ] array. The fir
17a80 73 74 20 63 6f 6f 72 64 69 6e 61 74 65 20 69 73  st coordinate is
17a90 20 61 44 61 74 61 5b 33 5d 2e 0a 20 20 20 20 2a   aData[3]..    *
17aa0 2a 0a 20 20 20 20 2a 2a 20 4e 42 3a 20 6e 44 61  *.    ** NB: nDa
17ab0 74 61 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6c  ta can only be l
17ac0 65 73 73 20 74 68 61 6e 20 6e 44 69 6d 2a 32 2b  ess than nDim*2+
17ad0 33 20 69 66 20 74 68 65 20 72 74 72 65 65 20 69  3 if the rtree i
17ae0 73 20 6d 69 73 2d 64 65 63 6c 61 72 65 64 0a 20  s mis-declared. 
17af0 20 20 20 2a 2a 20 77 69 74 68 20 22 63 6f 6c 75     ** with "colu
17b00 6d 6e 22 20 74 68 61 74 20 61 72 65 20 69 6e 74  mn" that are int
17b10 65 72 70 72 65 74 65 64 20 61 73 20 74 61 62 6c  erpreted as tabl
17b20 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  e constraints.. 
17b30 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 20     ** Example:  
17b40 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
17b50 41 42 4c 45 20 62 61 64 20 55 53 49 4e 47 20 72  ABLE bad USING r
17b60 74 72 65 65 28 78 2c 79 2c 43 48 45 43 4b 28 79  tree(x,y,CHECK(y
17b70 3e 35 29 29 3b 0a 20 20 20 20 2a 2a 20 54 68 69  >5));.    ** Thi
17b80 73 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 64 69  s problem was di
17b90 73 63 6f 76 65 72 65 64 20 61 66 74 65 72 20 79  scovered after y
17ba0 65 61 72 73 20 6f 66 20 75 73 65 2c 20 73 6f 20  ears of use, so 
17bb0 77 65 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f  we silently igno
17bc0 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 73 65 20  re.    ** these 
17bd0 6b 69 6e 64 73 20 6f 66 20 6d 69 73 64 65 63 6c  kinds of misdecl
17be0 61 72 65 64 20 74 61 62 6c 65 73 20 74 6f 20 61  ared tables to a
17bf0 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 61 6e  void breaking an
17c00 79 20 6c 65 67 61 63 79 2e 0a 20 20 20 20 2a 2f  y legacy..    */
17c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17c20 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
17c30 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e      if( pRtree->
17c40 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45  eCoordType==RTRE
17c50 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29  E_COORD_REAL32 )
17c60 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
17c70 3b 20 69 69 3c 6e 6e 3b 20 69 69 2b 3d 32 29 7b  ; ii<nn; ii+=2){
17c80 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 2e 61 43  .        cell.aC
17c90 6f 6f 72 64 5b 69 69 5d 2e 66 20 3d 20 72 74 72  oord[ii].f = rtr
17ca0 65 65 56 61 6c 75 65 44 6f 77 6e 28 61 44 61 74  eeValueDown(aDat
17cb0 61 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20  a[ii+3]);.      
17cc0 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69    cell.aCoord[ii
17cd0 2b 31 5d 2e 66 20 3d 20 72 74 72 65 65 56 61 6c  +1].f = rtreeVal
17ce0 75 65 55 70 28 61 44 61 74 61 5b 69 69 2b 34 5d  ueUp(aData[ii+4]
17cf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
17d00 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66  ell.aCoord[ii].f
17d10 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b  >cell.aCoord[ii+
17d20 31 5d 2e 66 20 29 7b 0a 20 20 20 20 20 20 20 20  1].f ){.        
17d30 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e 73    rc = rtreeCons
17d40 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74 72  traintError(pRtr
17d50 65 65 2c 20 69 69 2b 31 29 3b 0a 20 20 20 20 20  ee, ii+1);.     
17d60 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72       goto constr
17d70 61 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aint;.        }.
17d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
17d90 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
17da0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
17db0 69 3c 6e 6e 3b 20 69 69 2b 3d 32 29 7b 0a 20 20  i<nn; ii+=2){.  
17dc0 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72        cell.aCoor
17dd0 64 5b 69 69 5d 2e 69 20 3d 20 73 71 6c 69 74 65  d[ii].i = sqlite
17de0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 44 61 74  3_value_int(aDat
17df0 61 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20  a[ii+3]);.      
17e00 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69    cell.aCoord[ii
17e10 2b 31 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f  +1].i = sqlite3_
17e20 76 61 6c 75 65 5f 69 6e 74 28 61 44 61 74 61 5b  value_int(aData[
17e30 69 69 2b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  ii+4]);.        
17e40 69 66 28 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b  if( cell.aCoord[
17e50 69 69 5d 2e 69 3e 63 65 6c 6c 2e 61 43 6f 6f 72  ii].i>cell.aCoor
17e60 64 5b 69 69 2b 31 5d 2e 69 20 29 7b 0a 20 20 20  d[ii+1].i ){.   
17e70 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
17e80 65 43 6f 6e 73 74 72 61 69 6e 74 45 72 72 6f 72  eConstraintError
17e90 28 70 52 74 72 65 65 2c 20 69 69 2b 31 29 3b 0a  (pRtree, ii+1);.
17ea0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63            goto c
17eb0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20  onstraint;.     
17ec0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17ed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
17ee0 72 6f 77 69 64 20 76 61 6c 75 65 20 77 61 73 20  rowid value was 
17ef0 73 75 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20  supplied, check 
17f00 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
17f10 20 70 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20   present in .   
17f20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49   ** the table. I
17f30 66 20 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72  f so, the constr
17f40 61 69 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e  aint has failed.
17f50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
17f60 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
17f70 44 61 74 61 5b 32 5d 29 21 3d 53 51 4c 49 54 45  Data[2])!=SQLITE
17f80 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 63  _NULL ){.      c
17f90 65 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c  ell.iRowid = sql
17fa0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
17fb0 28 61 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20 20  (aData[2]);.    
17fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
17fd0 6c 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b 30  lue_type(aData[0
17fe0 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  ])==SQLITE_NULL.
17ff0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
18000 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44  3_value_int64(aD
18010 61 74 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e 69 52  ata[0])!=cell.iR
18020 6f 77 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20  owid.      ){.  
18030 20 20 20 20 20 20 69 6e 74 20 73 74 65 70 72 63        int steprc
18040 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18050 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
18060 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c  ree->pReadRowid,
18070 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69 64 29   1, cell.iRowid)
18080 3b 0a 20 20 20 20 20 20 20 20 73 74 65 70 72 63  ;.        steprc
18090 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
180a0 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
180b0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  id);.        rc 
180c0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
180d0 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
180e0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  id);.        if(
180f0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 74 65   SQLITE_ROW==ste
18100 70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  prc ){.         
18110 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 74 61   if( sqlite3_vta
18120 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 52  b_on_conflict(pR
18130 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c 49 54  tree->db)==SQLIT
18140 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
18150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 74           rc = rt
18160 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70  reeDeleteRowid(p
18170 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f 77  Rtree, cell.iRow
18180 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  id);.          }
18190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
181a0 20 20 72 63 20 3d 20 72 74 72 65 65 43 6f 6e 73    rc = rtreeCons
181b0 74 72 61 69 6e 74 45 72 72 6f 72 28 70 52 74 72  traintError(pRtr
181c0 65 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ee, 0);.        
181d0 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
181e0 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  int;.          }
181f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18200 20 7d 0a 20 20 20 20 20 20 62 48 61 76 65 52 6f   }.      bHaveRo
18210 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  wid = 1;.    }. 
18220 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 44 61 74   }..  /* If aDat
18230 61 5b 30 5d 20 69 73 20 6e 6f 74 20 61 6e 20 53  a[0] is not an S
18240 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 69  QL NULL value, i
18250 74 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f  t is the rowid o
18260 66 20 61 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  f a.  ** record 
18270 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 74  to delete from t
18280 68 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e  he r-tree table.
18290 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
182a0 6c 6f 63 6b 20 64 6f 65 73 0a 20 20 2a 2a 20 6a  lock does.  ** j
182b0 75 73 74 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20  ust that..  */. 
182c0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
182d0 75 65 5f 74 79 70 65 28 61 44 61 74 61 5b 30 5d  ue_type(aData[0]
182e0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
182f0 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65  {.    rc = rtree
18300 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74 72  DeleteRowid(pRtr
18310 65 65 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee, sqlite3_valu
18320 65 5f 69 6e 74 36 34 28 61 44 61 74 61 5b 30 5d  e_int64(aData[0]
18330 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ));.  }..  /* If
18340 20 74 68 65 20 61 44 61 74 61 5b 5d 20 61 72 72   the aData[] arr
18350 61 79 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  ay contains more
18360 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
18370 74 2c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  t, elements.  **
18380 20 28 61 44 61 74 61 5b 32 5d 2e 2e 61 44 61 74   (aData[2]..aDat
18390 61 5b 61 72 67 63 2d 31 5d 29 20 63 6f 6e 74 61  a[argc-1]) conta
183a0 69 6e 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  in a new record 
183b0 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 0a 20  to insert into. 
183c0 20 2a 2a 20 74 68 65 20 72 2d 74 72 65 65 20 73   ** the r-tree s
183d0 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
183e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
183f0 4f 4b 20 26 26 20 6e 44 61 74 61 3e 31 20 29 7b  OK && nData>1 ){
18400 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
18410 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e  he new record in
18420 74 6f 20 74 68 65 20 72 2d 74 72 65 65 20 2a 2f  to the r-tree */
18430 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  .    RtreeNode *
18440 70 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 20 20  pLeaf = 0;..    
18450 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
18460 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  e rowid of the n
18470 65 77 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  ew row. */.    i
18480 66 28 20 62 48 61 76 65 52 6f 77 69 64 3d 3d 30  f( bHaveRowid==0
18490 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
184a0 74 72 65 65 4e 65 77 52 6f 77 69 64 28 70 52 74  treeNewRowid(pRt
184b0 72 65 65 2c 20 26 63 65 6c 6c 2e 69 52 6f 77 69  ree, &cell.iRowi
184c0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  d);.    }.    *p
184d0 52 6f 77 69 64 20 3d 20 63 65 6c 6c 2e 69 52 6f  Rowid = cell.iRo
184e0 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  wid;..    if( rc
184f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18500 20 20 20 20 20 72 63 20 3d 20 43 68 6f 6f 73 65       rc = Choose
18510 4c 65 61 66 28 70 52 74 72 65 65 2c 20 26 63 65  Leaf(pRtree, &ce
18520 6c 6c 2c 20 30 2c 20 26 70 4c 65 61 66 29 3b 0a  ll, 0, &pLeaf);.
18530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18550 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
18560 20 20 20 20 70 52 74 72 65 65 2d 3e 69 52 65 69      pRtree->iRei
18570 6e 73 65 72 74 48 65 69 67 68 74 20 3d 20 2d 31  nsertHeight = -1
18580 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72  ;.      rc = rtr
18590 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
185a0 72 65 65 2c 20 70 4c 65 61 66 2c 20 26 63 65 6c  ree, pLeaf, &cel
185b0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  l, 0);.      rc2
185c0 20 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70   = nodeRelease(p
185d0 52 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20  Rtree, pLeaf);. 
185e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
185f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18600 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
18610 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18630 26 26 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 20  && pRtree->nAux 
18640 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18650 5f 73 74 6d 74 20 2a 70 55 70 20 3d 20 70 52 74  _stmt *pUp = pRt
18660 72 65 65 2d 3e 70 57 72 69 74 65 41 75 78 3b 0a  ree->pWriteAux;.
18670 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
18680 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
18690 5f 69 6e 74 36 34 28 70 55 70 2c 20 31 2c 20 2a  _int64(pUp, 1, *
186a0 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66  pRowid);.      f
186b0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 52 74 72  or(jj=0; jj<pRtr
186c0 65 65 2d 3e 6e 41 75 78 3b 20 6a 6a 2b 2b 29 7b  ee->nAux; jj++){
186d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
186e0 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 2c  _bind_value(pUp,
186f0 20 6a 6a 2b 32 2c 20 61 44 61 74 61 5b 70 52 74   jj+2, aData[pRt
18700 72 65 65 2d 3e 6e 44 69 6d 32 2b 33 2b 6a 6a 5d  ree->nDim2+3+jj]
18710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18720 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55   sqlite3_step(pU
18730 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
18740 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70  qlite3_reset(pUp
18750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 63 6f  );.    }.  }..co
18760 6e 73 74 72 61 69 6e 74 3a 0a 20 20 72 74 72 65  nstraint:.  rtre
18770 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 29  eRelease(pRtree)
18780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18790 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
187a0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
187b0 6e 20 73 74 61 72 74 73 2e 0a 2a 2f 0a 73 74 61  n starts..*/.sta
187c0 74 69 63 20 69 6e 74 20 72 74 72 65 65 42 65 67  tic int rtreeBeg
187d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 71  inTransaction(sq
187e0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
187f0 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  b){.  Rtree *pRt
18800 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70  ree = (Rtree *)p
18810 56 74 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  Vtab;.  assert( 
18820 70 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e  pRtree->inWrTran
18830 73 3d 3d 30 20 29 3b 0a 20 20 70 52 74 72 65 65  s==0 );.  pRtree
18840 2d 3e 69 6e 57 72 54 72 61 6e 73 2b 2b 3b 0a 20  ->inWrTrans++;. 
18850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18860 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  K;.}../*.** Call
18870 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
18880 63 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 73 20  ction completes 
18890 28 65 69 74 68 65 72 20 62 79 20 43 4f 4d 4d 49  (either by COMMI
188a0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 29 2e 0a  T or ROLLBACK)..
188b0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 62  ** The sqlite3_b
188c0 6c 6f 62 20 6f 62 6a 65 63 74 20 73 68 6f 75 6c  lob object shoul
188d0 64 20 62 65 20 72 65 6c 65 61 73 65 64 20 61 74  d be released at
188e0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
188f0 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
18900 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
18910 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
18920 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  ab){.  Rtree *pR
18930 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
18940 70 56 74 61 62 3b 0a 20 20 70 52 74 72 65 65 2d  pVtab;.  pRtree-
18950 3e 69 6e 57 72 54 72 61 6e 73 20 3d 20 30 3b 0a  >inWrTrans = 0;.
18960 20 20 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28    nodeBlobReset(
18970 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72  pRtree);.  retur
18980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18990 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 65 6e 61 6d  /*.** The xRenam
189a0 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 72 74 72  e method for rtr
189b0 65 65 20 6d 6f 64 75 6c 65 20 76 69 72 74 75 61  ee module virtua
189c0 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
189d0 74 69 63 20 69 6e 74 20 72 74 72 65 65 52 65 6e  tic int rtreeRen
189e0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ame(sqlite3_vtab
189f0 20 2a 70 56 74 61 62 2c 20 63 6f 6e 73 74 20 63   *pVtab, const c
18a00 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a  har *zNewName){.
18a10 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 20    Rtree *pRtree 
18a20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74 61 62  = (Rtree *)pVtab
18a30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18a40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 63 68 61  ITE_NOMEM;.  cha
18a50 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
18a60 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22  3_mprintf(.    "
18a70 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
18a80 25 71 5f 6e 6f 64 65 27 20 20 20 52 45 4e 41 4d  %q_node'   RENAM
18a90 45 20 54 4f 20 5c 22 25 77 5f 6e 6f 64 65 5c 22  E TO \"%w_node\"
18aa0 3b 22 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  ;".    "ALTER TA
18ab0 42 4c 45 20 25 51 2e 27 25 71 5f 70 61 72 65 6e  BLE %Q.'%q_paren
18ac0 74 27 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25  t' RENAME TO \"%
18ad0 77 5f 70 61 72 65 6e 74 5c 22 3b 22 0a 20 20 20  w_parent\";".   
18ae0 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51   "ALTER TABLE %Q
18af0 2e 27 25 71 5f 72 6f 77 69 64 27 20 20 52 45 4e  .'%q_rowid'  REN
18b00 41 4d 45 20 54 4f 20 5c 22 25 77 5f 72 6f 77 69  AME TO \"%w_rowi
18b10 64 5c 22 3b 22 0a 20 20 20 20 2c 20 70 52 74 72  d\";".    , pRtr
18b20 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
18b30 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  >zName, zNewName
18b40 20 0a 20 20 20 20 2c 20 70 52 74 72 65 65 2d 3e   .    , pRtree->
18b50 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a 4e 61  zDb, pRtree->zNa
18b60 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 20 0a 20 20  me, zNewName .  
18b70 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c    , pRtree->zDb,
18b80 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
18b90 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  zNewName.  );.  
18ba0 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20  if( zSql ){.    
18bb0 6e 6f 64 65 42 6c 6f 62 52 65 73 65 74 28 70 52  nodeBlobReset(pR
18bc0 74 72 65 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  tree);.    rc = 
18bd0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 52 74  sqlite3_exec(pRt
18be0 72 65 65 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  ree->db, zSql, 0
18bf0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
18c00 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
18c10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
18c30 53 61 76 65 70 6f 69 6e 74 20 6d 65 74 68 6f 64  Savepoint method
18c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  ..**.** This mod
18c50 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ule does not nee
18c60 64 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  d to do anything
18c70 20 74 6f 20 73 75 70 70 6f 72 74 20 73 61 76 65   to support save
18c80 70 6f 69 6e 74 73 2e 20 48 6f 77 65 76 65 72 2c  points. However,
18c90 0a 2a 2a 20 69 74 20 75 73 65 73 20 74 68 69 73  .** it uses this
18ca0 20 68 6f 6f 6b 20 74 6f 20 63 6c 6f 73 65 20 61   hook to close a
18cb0 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20 68 61 6e  ny open blob han
18cc0 64 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  dle. This is don
18cd0 65 20 62 65 63 61 75 73 65 20 61 20 0a 2a 2a 20  e because a .** 
18ce0 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
18cf0 6e 64 20 2d 20 77 68 69 63 68 20 66 6f 72 74 75  nd - which fortu
18d00 6e 61 74 65 6c 79 20 61 6c 77 61 79 73 20 6f 70  nately always op
18d10 65 6e 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ens a savepoint 
18d20 2d 20 63 61 6e 6e 6f 74 20 0a 2a 2a 20 73 75 63  - cannot .** suc
18d30 63 65 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ceed if there ar
18d40 65 20 61 6e 79 20 6f 70 65 6e 20 62 6c 6f 62 20  e any open blob 
18d50 68 61 6e 64 6c 65 73 2e 20 69 2e 65 2e 20 69 66  handles. i.e. if
18d60 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
18d70 20 77 65 72 65 0a 2a 2a 20 6e 6f 74 20 63 6c 6f   were.** not clo
18d80 73 65 64 20 68 65 72 65 2c 20 74 68 65 20 66 6f  sed here, the fo
18d90 6c 6c 6f 77 69 6e 67 20 77 6f 75 6c 64 20 66 61  llowing would fa
18da0 69 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 42 45 47 49  il:.**.**   BEGI
18db0 4e 3b 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54  N;.**     INSERT
18dc0 20 49 4e 54 4f 20 72 74 72 65 65 2e 2e 2e 0a 2a   INTO rtree....*
18dd0 2a 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  *     DROP TABLE
18de0 20 3c 74 61 62 6c 65 6e 61 6d 65 3e 3b 20 20 20   <tablename>;   
18df0 20 2d 2d 20 57 6f 75 6c 64 20 66 61 69 6c 20 77   -- Would fail w
18e00 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
18e10 44 0a 2a 2a 20 20 20 43 4f 4d 4d 49 54 3b 0a 2a  D.**   COMMIT;.*
18e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
18e30 65 65 53 61 76 65 70 6f 69 6e 74 28 73 71 6c 69  eeSavepoint(sqli
18e40 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
18e50 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
18e60 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
18e70 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
18e80 61 62 3b 0a 20 20 75 38 20 69 77 74 20 3d 20 70  ab;.  u8 iwt = p
18e90 52 74 72 65 65 2d 3e 69 6e 57 72 54 72 61 6e 73  Rtree->inWrTrans
18ea0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
18eb0 45 54 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29  ETER(iSavepoint)
18ec0 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69 6e 57 72  ;.  pRtree->inWr
18ed0 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 6e 6f 64  Trans = 0;.  nod
18ee0 65 42 6c 6f 62 52 65 73 65 74 28 70 52 74 72 65  eBlobReset(pRtre
18ef0 65 29 3b 0a 20 20 70 52 74 72 65 65 2d 3e 69 6e  e);.  pRtree->in
18f00 57 72 54 72 61 6e 73 20 3d 20 69 77 74 3b 0a 20  WrTrans = iwt;. 
18f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
18f30 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
18f40 74 65 73 20 74 68 65 20 70 52 74 72 65 65 2d 3e  tes the pRtree->
18f50 6e 52 6f 77 45 73 74 20 76 61 72 69 61 62 6c 65  nRowEst variable
18f60 20 77 69 74 68 20 61 6e 20 65 73 74 69 6d 61 74   with an estimat
18f70 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d 62  e.** of the numb
18f80 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
18f90 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
18fa0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
18fb0 69 73 20 69 73 20 62 61 73 65 64 0a 2a 2a 20 6f  is is based.** o
18fc0 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64  n sqlite_stat1 d
18fd0 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ata. Otherwise, 
18fe0 75 73 65 20 52 54 52 45 45 5f 44 45 46 41 55 4c  use RTREE_DEFAUL
18ff0 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a 73 74 61  T_ROWEST..*/.sta
19000 74 69 63 20 69 6e 74 20 72 74 72 65 65 51 75 65  tic int rtreeQue
19010 72 79 53 74 61 74 31 28 73 71 6c 69 74 65 33 20  ryStat1(sqlite3 
19020 2a 64 62 2c 20 52 74 72 65 65 20 2a 70 52 74 72  *db, Rtree *pRtr
19030 65 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ee){.  const cha
19040 72 20 2a 7a 46 6d 74 20 3d 20 22 53 45 4c 45 43  r *zFmt = "SELEC
19050 54 20 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73  T stat FROM %Q.s
19060 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
19070 45 20 74 62 6c 20 3d 20 27 25 71 5f 72 6f 77 69  E tbl = '%q_rowi
19080 64 27 22 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  d'";.  char *zSq
19090 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  l;.  sqlite3_stm
190a0 74 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t *p;.  int rc;.
190b0 20 20 69 36 34 20 6e 52 6f 77 20 3d 20 30 3b 0a    i64 nRow = 0;.
190c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
190d0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
190e0 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c  adata(.      db,
190f0 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 22 73   pRtree->zDb, "s
19100 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 30 2c 30  qlite_stat1",0,0
19110 2c 30 2c 30 2c 30 2c 30 0a 20 20 29 3b 0a 20 20  ,0,0,0,0.  );.  
19120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19130 4b 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65 2d  K ){.    pRtree-
19140 3e 6e 52 6f 77 45 73 74 20 3d 20 52 54 52 45 45  >nRowEst = RTREE
19150 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 3b  _DEFAULT_ROWEST;
19160 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3d 3d  .    return rc==
19170 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3f 20 53  SQLITE_ERROR ? S
19180 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 3b 0a 20  QLITE_OK : rc;. 
19190 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
191a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74  te3_mprintf(zFmt
191b0 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70  , pRtree->zDb, p
191c0 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Rtree->zName);. 
191d0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
191e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
191f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
19200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19210 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
19220 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2c 20 30 29  zSql, -1, &p, 0)
19230 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19250 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
19260 70 28 70 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  p(p)==SQLITE_ROW
19270 20 29 20 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65   ) nRow = sqlite
19280 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
19290 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
192a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
192b0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  e(p);.    }else 
192c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
192d0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
192e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
192f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
19300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19310 20 20 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30 20      if( nRow==0 
19320 29 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72 65  ){.        pRtre
19330 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 52 54 52  e->nRowEst = RTR
19340 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  EE_DEFAULT_ROWES
19350 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
19360 20 20 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e          pRtree->
19370 6e 52 6f 77 45 73 74 20 3d 20 4d 41 58 28 6e 52  nRowEst = MAX(nR
19380 6f 77 2c 20 52 54 52 45 45 5f 4d 49 4e 5f 52 4f  ow, RTREE_MIN_RO
19390 57 45 53 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  WEST);.      }. 
193a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
193b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
193c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
193d0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
193e0 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73  true if zName is
193f0 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
19400 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 68 61  n one of the sha
19410 64 6f 77 20 74 61 62 6c 65 73 20 75 73 65 64 0a  dow tables used.
19420 2a 2a 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c  ** by this modul
19430 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19440 20 72 74 72 65 65 53 68 61 64 6f 77 4e 61 6d 65   rtreeShadowName
19450 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
19460 6d 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  me){.  static co
19470 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 61 6d 65  nst char *azName
19480 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 6f 64 65  [] = {.    "node
19490 22 2c 20 22 70 61 72 65 6e 74 22 2c 20 22 72 6f  ", "parent", "ro
194a0 77 69 64 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  wid".  };.  unsi
194b0 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 66 6f  gned int i;.  fo
194c0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
194d0 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61  azName)/sizeof(a
194e0 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zName[0]); i++){
194f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19500 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
19510 61 7a 4e 61 6d 65 5b 69 5d 29 3d 3d 30 20 29 20  azName[i])==0 ) 
19520 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
19530 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
19540 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
19550 6c 65 20 72 74 72 65 65 4d 6f 64 75 6c 65 20 3d  le rtreeModule =
19560 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
19590 20 20 72 74 72 65 65 43 72 65 61 74 65 2c 20 20    rtreeCreate,  
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195b0 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
195c0 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72  e a table */.  r
195d0 74 72 65 65 43 6f 6e 6e 65 63 74 2c 20 20 20 20  treeConnect,    
195e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
195f0 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74  onnect - connect
19600 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20   to an existing 
19610 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65  table */.  rtree
19620 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
19630 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49         /* xBestI
19640 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e 65  ndex - Determine
19650 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79   search strategy
19660 20 2a 2f 0a 20 20 72 74 72 65 65 44 69 73 63 6f   */.  rtreeDisco
19670 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
19680 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
19690 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72   - Disconnect fr
196a0 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  om a table */.  
196b0 72 74 72 65 65 44 65 73 74 72 6f 79 2c 20 20 20  rtreeDestroy,   
196c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
196d0 44 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61  Destroy - Drop a
196e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65   table */.  rtre
196f0 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  eOpen,          
19700 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
19710 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
19720 20 2a 2f 0a 20 20 72 74 72 65 65 43 6c 6f 73 65   */.  rtreeClose
19730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19740 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
19750 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
19760 20 20 72 74 72 65 65 46 69 6c 74 65 72 2c 20 20    rtreeFilter,  
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19780 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
19790 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
197a0 61 69 6e 74 73 20 2a 2f 0a 20 20 72 74 72 65 65  aints */.  rtree
197b0 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
197c0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
197d0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
197e0 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66  or */.  rtreeEof
197f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19800 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20      /* xEof */. 
19810 20 72 74 72 65 65 43 6f 6c 75 6d 6e 2c 20 20 20   rtreeColumn,   
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19830 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
19840 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f  ata */.  rtreeRo
19850 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
19860 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
19870 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
19880 72 74 72 65 65 55 70 64 61 74 65 2c 20 20 20 20  rtreeUpdate,    
19890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
198a0 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64  Update - write d
198b0 61 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 42 65  ata */.  rtreeBe
198c0 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ginTransaction, 
198d0 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d       /* xBegin -
198e0 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
198f0 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64  on */.  rtreeEnd
19900 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
19910 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
19920 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
19930 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61  */.  rtreeEndTra
19940 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  nsaction,       
19950 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f   /* xCommit - co
19960 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
19970 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72   */.  rtreeEndTr
19980 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20  ansaction,      
19990 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
199a0 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
199b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46         /* xFindF
199e0 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69  unction - functi
199f0 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a  on overloading *
19a00 2f 0a 20 20 72 74 72 65 65 52 65 6e 61 6d 65 2c  /.  rtreeRename,
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e  /* xRename - ren
19a30 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ame the table */
19a40 0a 20 20 72 74 72 65 65 53 61 76 65 70 6f 69 6e  .  rtreeSavepoin
19a50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
19a60 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
19a70 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a90 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30   xRelease */.  0
19aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
19ac0 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20 72  ollbackTo */.  r
19ad0 74 72 65 65 53 68 61 64 6f 77 4e 61 6d 65 20 20  treeShadowName  
19ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
19af0 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a  hadowName */.};.
19b00 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
19b10 65 53 71 6c 49 6e 69 74 28 0a 20 20 52 74 72 65  eSqlInit(.  Rtre
19b20 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 73 71  e *pRtree, .  sq
19b30 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
19b40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a  nst char *zDb, .
19b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
19b60 72 65 66 69 78 2c 20 0a 20 20 69 6e 74 20 69 73  refix, .  int is
19b70 43 72 65 61 74 65 0a 29 7b 0a 20 20 69 6e 74 20  Create.){.  int 
19b80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19b90 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 54 41  .  #define N_STA
19ba0 54 45 4d 45 4e 54 20 38 0a 20 20 73 74 61 74 69  TEMENT 8.  stati
19bb0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
19bc0 53 71 6c 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d  Sql[N_STATEMENT]
19bd0 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74   = {.    /* Writ
19be0 65 20 74 68 65 20 78 78 78 5f 6e 6f 64 65 20 74  e the xxx_node t
19bf0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 22 49 4e 53  able */.    "INS
19c00 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
19c10 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64  NTO '%q'.'%q_nod
19c20 65 27 20 56 41 4c 55 45 53 28 3f 31 2c 20 3f 32  e' VALUES(?1, ?2
19c30 29 22 2c 0a 20 20 20 20 22 44 45 4c 45 54 45 20  )",.    "DELETE 
19c40 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e 6f  FROM '%q'.'%q_no
19c50 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f  de' WHERE nodeno
19c60 20 3d 20 3f 31 22 2c 0a 0a 20 20 20 20 2f 2a 20   = ?1",..    /* 
19c70 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 74  Read and write t
19c80 68 65 20 78 78 78 5f 72 6f 77 69 64 20 74 61 62  he xxx_rowid tab
19c90 6c 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45 43  le */.    "SELEC
19ca0 54 20 6e 6f 64 65 6e 6f 20 46 52 4f 4d 20 27 25  T nodeno FROM '%
19cb0 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 57 48  q'.'%q_rowid' WH
19cc0 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 31 22 2c  ERE rowid = ?1",
19cd0 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20  .    "INSERT OR 
19ce0 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
19cf0 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 56 41 4c  '.'%q_rowid' VAL
19d00 55 45 53 28 3f 31 2c 20 3f 32 29 22 2c 0a 20 20  UES(?1, ?2)",.  
19d10 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
19d20 25 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 57  %q'.'%q_rowid' W
19d30 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 31 22  HERE rowid = ?1"
19d40 2c 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61  ,..    /* Read a
19d50 6e 64 20 77 72 69 74 65 20 74 68 65 20 78 78 78  nd write the xxx
19d60 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  _parent table */
19d70 0a 20 20 20 20 22 53 45 4c 45 43 54 20 70 61 72  .    "SELECT par
19d80 65 6e 74 6e 6f 64 65 20 46 52 4f 4d 20 27 25 71  entnode FROM '%q
19d90 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57 48  '.'%q_parent' WH
19da0 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3f 31 22  ERE nodeno = ?1"
19db0 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  ,.    "INSERT OR
19dc0 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25   REPLACE INTO '%
19dd0 71 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 56  q'.'%q_parent' V
19de0 41 4c 55 45 53 28 3f 31 2c 20 3f 32 29 22 2c 0a  ALUES(?1, ?2)",.
19df0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
19e00 20 27 25 71 27 2e 27 25 71 5f 70 61 72 65 6e 74   '%q'.'%q_parent
19e10 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d  ' WHERE nodeno =
19e20 20 3f 31 22 0a 20 20 7d 3b 0a 20 20 73 71 6c 69   ?1".  };.  sqli
19e30 74 65 33 5f 73 74 6d 74 20 2a 2a 61 70 70 53 74  te3_stmt **appSt
19e40 6d 74 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d 3b  mt[N_STATEMENT];
19e50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
19e60 74 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45  t int f = SQLITE
19e70 5f 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54  _PREPARE_PERSIST
19e80 45 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41  ENT|SQLITE_PREPA
19e90 52 45 5f 4e 4f 5f 56 54 41 42 3b 0a 0a 20 20 70  RE_NO_VTAB;..  p
19ea0 52 74 72 65 65 2d 3e 64 62 20 3d 20 64 62 3b 0a  Rtree->db = db;.
19eb0 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
19ec0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 72  ){.    char *zCr
19ed0 65 61 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  eate;.    sqlite
19ee0 33 5f 73 74 72 20 2a 70 20 3d 20 73 71 6c 69 74  3_str *p = sqlit
19ef0 65 33 5f 73 74 72 5f 6e 65 77 28 64 62 29 3b 0a  e3_str_new(db);.
19f00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
19f10 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
19f20 6e 64 66 28 70 2c 0a 20 20 20 20 20 20 20 22 43  ndf(p,.       "C
19f30 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77  REATE TABLE \"%w
19f40 5c 22 2e 5c 22 25 77 5f 72 6f 77 69 64 5c 22 28  \".\"%w_rowid\"(
19f50 72 6f 77 69 64 20 49 4e 54 45 47 45 52 20 50 52  rowid INTEGER PR
19f60 49 4d 41 52 59 20 4b 45 59 2c 6e 6f 64 65 6e 6f  IMARY KEY,nodeno
19f70 22 2c 0a 20 20 20 20 20 20 20 7a 44 62 2c 20 7a  ",.       zDb, z
19f80 50 72 65 66 69 78 29 3b 0a 20 20 20 20 66 6f 72  Prefix);.    for
19f90 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65 65  (ii=0; ii<pRtree
19fa0 2d 3e 6e 41 75 78 3b 20 69 69 2b 2b 29 7b 0a 20  ->nAux; ii++){. 
19fb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
19fc0 5f 61 70 70 65 6e 64 66 28 70 2c 22 2c 61 25 64  _appendf(p,",a%d
19fd0 22 2c 69 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ",ii);.    }.   
19fe0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
19ff0 65 6e 64 66 28 70 2c 0a 20 20 20 20 20 20 22 29  endf(p,.      ")
1a000 3b 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  ;CREATE TABLE \"
1a010 25 77 5c 22 2e 5c 22 25 77 5f 6e 6f 64 65 5c 22  %w\".\"%w_node\"
1a020 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20  (nodeno INTEGER 
1a030 50 52 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61  PRIMARY KEY,data
1a040 29 3b 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c 20  );",.      zDb, 
1a050 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 73 71  zPrefix);.    sq
1a060 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
1a070 66 28 70 2c 0a 20 20 20 20 22 43 52 45 41 54 45  f(p,.    "CREATE
1a080 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22   TABLE \"%w\".\"
1a090 25 77 5f 70 61 72 65 6e 74 5c 22 28 6e 6f 64 65  %w_parent\"(node
1a0a0 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
1a0b0 52 59 20 4b 45 59 2c 70 61 72 65 6e 74 6e 6f 64  RY KEY,parentnod
1a0c0 65 29 3b 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c  e);",.      zDb,
1a0d0 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 73   zPrefix);.    s
1a0e0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
1a0f0 64 66 28 70 2c 0a 20 20 20 20 20 20 20 22 49 4e  df(p,.       "IN
1a100 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22  SERT INTO \"%w\"
1a110 2e 5c 22 25 77 5f 6e 6f 64 65 5c 22 56 41 4c 55  .\"%w_node\"VALU
1a120 45 53 28 31 2c 7a 65 72 6f 62 6c 6f 62 28 25 64  ES(1,zeroblob(%d
1a130 29 29 22 2c 0a 20 20 20 20 20 20 20 7a 44 62 2c  ))",.       zDb,
1a140 20 7a 50 72 65 66 69 78 2c 20 70 52 74 72 65 65   zPrefix, pRtree
1a150 2d 3e 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20  ->iNodeSize);.  
1a160 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69    zCreate = sqli
1a170 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 70  te3_str_finish(p
1a180 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 72 65  );.    if( !zCre
1a190 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
1a1a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1a1b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a1c0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
1a1d0 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c  , zCreate, 0, 0,
1a1e0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1a1f0 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a  _free(zCreate);.
1a200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a230 20 20 7d 0a 0a 20 20 61 70 70 53 74 6d 74 5b 30    }..  appStmt[0
1a240 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 57 72  ] = &pRtree->pWr
1a250 69 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74  iteNode;.  appSt
1a260 6d 74 5b 31 5d 20 3d 20 26 70 52 74 72 65 65 2d  mt[1] = &pRtree-
1a270 3e 70 44 65 6c 65 74 65 4e 6f 64 65 3b 0a 20 20  >pDeleteNode;.  
1a280 61 70 70 53 74 6d 74 5b 32 5d 20 3d 20 26 70 52  appStmt[2] = &pR
1a290 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64  tree->pReadRowid
1a2a0 3b 0a 20 20 61 70 70 53 74 6d 74 5b 33 5d 20 3d  ;.  appStmt[3] =
1a2b0 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65   &pRtree->pWrite
1a2c0 52 6f 77 69 64 3b 0a 20 20 61 70 70 53 74 6d 74  Rowid;.  appStmt
1a2d0 5b 34 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70  [4] = &pRtree->p
1a2e0 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 20 20 61  DeleteRowid;.  a
1a2f0 70 70 53 74 6d 74 5b 35 5d 20 3d 20 26 70 52 74  ppStmt[5] = &pRt
1a300 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74  ree->pReadParent
1a310 3b 0a 20 20 61 70 70 53 74 6d 74 5b 36 5d 20 3d  ;.  appStmt[6] =
1a320 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65   &pRtree->pWrite
1a330 50 61 72 65 6e 74 3b 0a 20 20 61 70 70 53 74 6d  Parent;.  appStm
1a340 74 5b 37 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e  t[7] = &pRtree->
1a350 70 44 65 6c 65 74 65 50 61 72 65 6e 74 3b 0a 0a  pDeleteParent;..
1a360 20 20 72 63 20 3d 20 72 74 72 65 65 51 75 65 72    rc = rtreeQuer
1a370 79 53 74 61 74 31 28 64 62 2c 20 70 52 74 72 65  yStat1(db, pRtre
1a380 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1a390 3c 4e 5f 53 54 41 54 45 4d 45 4e 54 20 26 26 20  <N_STATEMENT && 
1a3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1a3b0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1a3c0 53 71 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Sql;.    const c
1a3d0 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b 0a 20 20  har *zFormat;.  
1a3e0 20 20 69 66 28 20 69 21 3d 33 20 7c 7c 20 70 52    if( i!=3 || pR
1a3f0 74 72 65 65 2d 3e 6e 41 75 78 3d 3d 30 20 29 7b  tree->nAux==0 ){
1a400 0a 20 20 20 20 20 20 20 7a 46 6f 72 6d 61 74 20  .       zFormat 
1a410 3d 20 61 7a 53 71 6c 5b 69 5d 3b 0a 20 20 20 20  = azSql[i];.    
1a420 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 2f  }else {.       /
1a430 2a 20 41 6e 20 55 50 53 45 52 54 20 69 73 20 76  * An UPSERT is v
1a440 65 72 79 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ery slightly slo
1a450 77 65 72 20 74 68 61 6e 20 52 45 50 4c 41 43 45  wer than REPLACE
1a460 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65 65 64  , but it is need
1a470 65 64 0a 20 20 20 20 20 20 20 2a 2a 20 69 66 20  ed.       ** if 
1a480 74 68 65 72 65 20 61 72 65 20 61 75 78 69 6c 69  there are auxili
1a490 61 72 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ary columns */. 
1a4a0 20 20 20 20 20 20 7a 46 6f 72 6d 61 74 20 3d 20        zFormat = 
1a4b0 22 49 4e 53 45 52 54 20 49 4e 54 4f 5c 22 25 77  "INSERT INTO\"%w
1a4c0 5c 22 2e 5c 22 25 77 5f 72 6f 77 69 64 5c 22 28  \".\"%w_rowid\"(
1a4d0 72 6f 77 69 64 2c 6e 6f 64 65 6e 6f 29 56 41 4c  rowid,nodeno)VAL
1a4e0 55 45 53 28 3f 31 2c 3f 32 29 22 0a 20 20 20 20  UES(?1,?2)".    
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
1a500 4e 20 43 4f 4e 46 4c 49 43 54 28 72 6f 77 69 64  N CONFLICT(rowid
1a510 29 44 4f 20 55 50 44 41 54 45 20 53 45 54 20 6e  )DO UPDATE SET n
1a520 6f 64 65 6e 6f 3d 65 78 63 6c 75 64 65 64 2e 6e  odeno=excluded.n
1a530 6f 64 65 6e 6f 22 3b 0a 20 20 20 20 7d 0a 20 20  odeno";.    }.  
1a540 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1a550 5f 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  _mprintf(zFormat
1a560 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69 78 29 3b  , zDb, zPrefix);
1a570 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
1a580 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a590 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 64  te3_prepare_v3(d
1a5a0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 66 2c 20  b, zSql, -1, f, 
1a5b0 61 70 70 53 74 6d 74 5b 69 5d 2c 20 30 29 3b 20  appStmt[i], 0); 
1a5c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a5d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1a5e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
1a5f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1a600 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 74  );.  }.  if( pRt
1a610 72 65 65 2d 3e 6e 41 75 78 20 29 7b 0a 20 20 20  ree->nAux ){.   
1a620 20 70 52 74 72 65 65 2d 3e 7a 52 65 61 64 41 75   pRtree->zReadAu
1a630 78 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  xSql = sqlite3_m
1a640 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
1a650 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1a660 25 77 5c 22 2e 5c 22 25 77 5f 72 6f 77 69 64 5c  %w\".\"%w_rowid\
1a670 22 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 31  " WHERE rowid=?1
1a680 22 2c 0a 20 20 20 20 20 20 20 7a 44 62 2c 20 7a  ",.       zDb, z
1a690 50 72 65 66 69 78 29 3b 0a 20 20 20 20 69 66 28  Prefix);.    if(
1a6a0 20 70 52 74 72 65 65 2d 3e 7a 52 65 61 64 41 75   pRtree->zReadAu
1a6b0 78 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xSql==0 ){.     
1a6c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a6d0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1a6e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1a6f0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   *p = sqlite3_st
1a700 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 20 20 20  r_new(db);.     
1a710 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 63   int ii;.      c
1a720 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
1a730 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1a740 65 6e 64 66 28 70 2c 20 22 55 50 44 41 54 45 20  endf(p, "UPDATE 
1a750 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 72 6f 77 69  \"%w\".\"%w_rowi
1a760 64 5c 22 53 45 54 20 22 2c 20 7a 44 62 2c 20 7a  d\"SET ", zDb, z
1a770 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 66  Prefix);.      f
1a780 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72  or(ii=0; ii<pRtr
1a790 65 65 2d 3e 6e 41 75 78 3b 20 69 69 2b 2b 29 7b  ee->nAux; ii++){
1a7a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 69 20  .        if( ii 
1a7b0 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70  ) sqlite3_str_ap
1a7c0 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b  pend(p, ",", 1);
1a7d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 69 3c  .        if( ii<
1a7e0 70 52 74 72 65 65 2d 3e 6e 41 75 78 4e 6f 74 4e  pRtree->nAuxNotN
1a7f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
1a800 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1a810 65 6e 64 66 28 70 2c 22 61 25 64 3d 63 6f 61 6c  endf(p,"a%d=coal
1a820 65 73 63 65 28 3f 25 64 2c 61 25 64 29 22 2c 69  esce(?%d,a%d)",i
1a830 69 2c 69 69 2b 32 2c 69 69 29 3b 0a 20 20 20 20  i,ii+2,ii);.    
1a840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
1a860 5f 61 70 70 65 6e 64 66 28 70 2c 22 61 25 64 3d  _appendf(p,"a%d=
1a870 3f 25 64 22 2c 69 69 2c 69 69 2b 32 29 3b 0a 20  ?%d",ii,ii+2);. 
1a880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1a8a0 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 20  tr_appendf(p, " 
1a8b0 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 31 22 29  WHERE rowid=?1")
1a8c0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
1a8d0 71 6c 69 74 65 33 5f 73 74 72 5f 66 69 6e 69 73  qlite3_str_finis
1a8e0 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  h(p);.      if( 
1a8f0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
1a900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a910 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
1a920 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1a930 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1a940 76 33 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v3(db, zSql, -1,
1a950 20 66 2c 20 26 70 52 74 72 65 65 2d 3e 70 57 72   f, &pRtree->pWr
1a960 69 74 65 41 75 78 2c 20 30 29 3b 20 0a 20 20 20  iteAux, 0); .   
1a970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1a980 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d  e(zSql);.      }
1a990 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1a9a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a9b0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1a9c0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
1a9d0 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
1a9e0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53  the text of an S
1a9f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  QL statement.** 
1aa00 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 73  that returns a s
1aa10 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61  ingle integer va
1aa20 6c 75 65 2e 20 54 68 65 20 73 74 61 74 65 6d 65  lue. The stateme
1aa30 6e 74 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61  nt is compiled a
1aa40 6e 64 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 75  nd executed.** u
1aa50 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1aa60 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 66 20  nnection db. If 
1aa70 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
1aa80 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 72 65  integer value re
1aa90 74 75 72 6e 65 64 0a 2a 2a 20 69 73 20 77 72 69  turned.** is wri
1aaa0 74 74 65 6e 20 74 6f 20 2a 70 69 56 61 6c 20 61  tten to *piVal a
1aab0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1aac0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1aad0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
1aae0 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
1aaf0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
1ab00 6c 75 65 20 6f 66 20 2a 70 69 56 61 6c 20 61 66  lue of *piVal af
1ab10 74 65 72 20 72 65 74 75 72 6e 69 6e 67 20 69 73  ter returning is
1ab20 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 2a 2f   not defined..*/
1ab30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 49  .static int getI
1ab40 6e 74 46 72 6f 6d 53 74 6d 74 28 73 71 6c 69 74  ntFromStmt(sqlit
1ab50 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1ab60 61 72 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 2a 70  ar *zSql, int *p
1ab70 69 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 20  iVal){.  int rc 
1ab80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1ab90 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
1aba0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1abb0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72  pStmt = 0;.    r
1abc0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1abd0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
1abe0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1abf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ac00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ac10 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
1ac20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1ac30 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  mt) ){.        *
1ac40 70 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  piVal = sqlite3_
1ac50 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
1ac60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1ac70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ac80 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1ac90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1aca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1acb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1acc0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  is called from w
1acd0 69 74 68 69 6e 20 74 68 65 20 78 43 6f 6e 6e 65  ithin the xConne
1ace0 63 74 28 29 20 6f 72 20 78 43 72 65 61 74 65 28  ct() or xCreate(
1acf0 29 20 6d 65 74 68 6f 64 20 74 6f 0a 2a 2a 20 64  ) method to.** d
1ad00 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 6f 64  etermine the nod
1ad10 65 2d 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e-size used by t
1ad20 68 65 20 72 74 72 65 65 20 74 61 62 6c 65 20 62  he rtree table b
1ad30 65 69 6e 67 20 63 72 65 61 74 65 64 20 6f 72 20  eing created or 
1ad40 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 74 6f 2e  connected.** to.
1ad50 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1ad60 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a  pRtree->iNodeSiz
1ad70 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61  e is populated a
1ad80 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1ad90 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
1ada0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
1adb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1adc0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1add0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ade0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 61 73   being called as
1adf0 20 70 61 72 74 20 6f 66 20 61 6e 20 78 43 6f 6e   part of an xCon
1ae00 6e 65 63 74 28 29 2c 20 74 68 65 6e 20 74 68 65  nect(), then the
1ae10 20 72 74 72 65 65 0a 2a 2a 20 74 61 62 6c 65 20   rtree.** table 
1ae20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
1ae30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1ae40 20 6e 6f 64 65 2d 73 69 7a 65 20 69 73 20 64 65   node-size is de
1ae50 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70  termined by insp
1ae60 65 63 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  ecting.** the ro
1ae70 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74  ot node of the t
1ae80 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ree..**.** Other
1ae90 77 69 73 65 2c 20 66 6f 72 20 61 6e 20 78 43 72  wise, for an xCr
1aea0 65 61 74 65 28 29 2c 20 75 73 65 20 36 34 20 62  eate(), use 64 b
1aeb0 79 74 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ytes less than t
1aec0 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
1aed0 2d 73 69 7a 65 2e 20 0a 2a 2a 20 54 68 69 73 20  -size. .** This 
1aee0 65 6e 73 75 72 65 73 20 74 68 61 74 20 65 61 63  ensures that eac
1aef0 68 20 6e 6f 64 65 20 69 73 20 73 74 6f 72 65 64  h node is stored
1af00 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 61 74   on a single dat
1af10 61 62 61 73 65 20 70 61 67 65 2e 20 49 66 20 74  abase page. If t
1af20 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
1af30 70 61 67 65 2d 73 69 7a 65 20 69 73 20 73 6f 20  page-size is so 
1af40 6c 61 72 67 65 20 74 68 61 74 20 6d 6f 72 65 20  large that more 
1af50 74 68 61 6e 20 52 54 52 45 45 5f 4d 41 58 43 45  than RTREE_MAXCE
1af60 4c 4c 53 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20  LLS entries .** 
1af70 77 6f 75 6c 64 20 66 69 74 20 69 6e 20 61 20 73  would fit in a s
1af80 69 6e 67 6c 65 20 6e 6f 64 65 2c 20 75 73 65 20  ingle node, use 
1af90 61 20 73 6d 61 6c 6c 65 72 20 6e 6f 64 65 2d 73  a smaller node-s
1afa0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
1afb0 6e 74 20 67 65 74 4e 6f 64 65 53 69 7a 65 28 0a  nt getNodeSize(.
1afc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
1aff0 6e 64 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65 20  ndle */.  Rtree 
1b000 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pRtree,        
1b010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 74 72            /* Rtr
1b020 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  ee handle */.  i
1b030 6e 74 20 69 73 43 72 65 61 74 65 2c 20 20 20 20  nt isCreate,    
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b050 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72 65 61  * True for xCrea
1b060 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 78 43  te, false for xC
1b070 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  onnect */.  char
1b080 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20   **pzErr        
1b090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b0a0 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
1b0b0 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 29 7b 0a  e, if any */.){.
1b0c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1b0d0 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 69 73   *zSql;.  if( is
1b0e0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 69 6e  Create ){.    in
1b0f0 74 20 69 50 61 67 65 53 69 7a 65 20 3d 20 30 3b  t iPageSize = 0;
1b100 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
1b110 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
1b120 47 4d 41 20 25 51 2e 70 61 67 65 5f 73 69 7a 65  GMA %Q.page_size
1b130 22 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 29 3b  ", pRtree->zDb);
1b140 0a 20 20 20 20 72 63 20 3d 20 67 65 74 49 6e 74  .    rc = getInt
1b150 46 72 6f 6d 53 74 6d 74 28 64 62 2c 20 7a 53 71  FromStmt(db, zSq
1b160 6c 2c 20 26 69 50 61 67 65 53 69 7a 65 29 3b 0a  l, &iPageSize);.
1b170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1b190 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
1b1a0 20 3d 20 69 50 61 67 65 53 69 7a 65 2d 36 34 3b   = iPageSize-64;
1b1b0 0a 20 20 20 20 20 20 69 66 28 20 28 34 2b 70 52  .      if( (4+pR
1b1c0 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43  tree->nBytesPerC
1b1d0 65 6c 6c 2a 52 54 52 45 45 5f 4d 41 58 43 45 4c  ell*RTREE_MAXCEL
1b1e0 4c 53 29 3c 70 52 74 72 65 65 2d 3e 69 4e 6f 64  LS)<pRtree->iNod
1b1f0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1b200 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69   pRtree->iNodeSi
1b210 7a 65 20 3d 20 34 2b 70 52 74 72 65 65 2d 3e 6e  ze = 4+pRtree->n
1b220 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 52 54 52  BytesPerCell*RTR
1b230 45 45 5f 4d 41 58 43 45 4c 4c 53 3b 0a 20 20 20  EE_MAXCELLS;.   
1b240 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1b250 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
1b260 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b270 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
1b280 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
1b290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 71    }else{.    zSq
1b2a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1b2b0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
1b2c0 4c 45 43 54 20 6c 65 6e 67 74 68 28 64 61 74 61  LECT length(data
1b2d0 29 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  ) FROM '%q'.'%q_
1b2e0 6e 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65  node' WHERE node
1b2f0 6e 6f 20 3d 20 31 22 2c 0a 20 20 20 20 20 20 20  no = 1",.       
1b300 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52   pRtree->zDb, pR
1b310 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  tree->zName.    
1b320 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 49  );.    rc = getI
1b330 6e 74 46 72 6f 6d 53 74 6d 74 28 64 62 2c 20 7a  ntFromStmt(db, z
1b340 53 71 6c 2c 20 26 70 52 74 72 65 65 2d 3e 69 4e  Sql, &pRtree->iN
1b350 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  odeSize);.    if
1b360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b370 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20  ){.      *pzErr 
1b380 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1b390 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
1b3a0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
1b3b0 20 7d 65 6c 73 65 20 69 66 28 20 70 52 74 72 65   }else if( pRtre
1b3c0 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 3c 28 35 31  e->iNodeSize<(51
1b3d0 32 2d 36 34 29 20 29 7b 0a 20 20 20 20 20 20 72  2-64) ){.      r
1b3e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1b3f0 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 52  PT_VTAB;.      R
1b400 54 52 45 45 5f 49 53 5f 43 4f 52 52 55 50 54 28  TREE_IS_CORRUPT(
1b410 70 52 74 72 65 65 29 3b 0a 20 20 20 20 20 20 2a  pRtree);.      *
1b420 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
1b430 6d 70 72 69 6e 74 66 28 22 75 6e 64 65 72 73 69  mprintf("undersi
1b440 7a 65 20 52 54 72 65 65 20 62 6c 6f 62 73 20 69  ze RTree blobs i
1b450 6e 20 5c 22 25 71 5f 6e 6f 64 65 5c 22 22 2c 0a  n \"%q_node\"",.
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b480 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Rtree->zName);. 
1b490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1b4a0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1b4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b4c0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1b4d0 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
1b4e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
1b4f0 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
1b500 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
1b510 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 72 2d  ethods of the r-
1b520 74 72 65 65 20 76 69 72 74 75 61 6c 20 74 61 62  tree virtual tab
1b530 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76  le..**.**   argv
1b540 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20  [0]   -> module 
1b550 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 31  name.**   argv[1
1b560 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20  ]   -> database 
1b570 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32  name.**   argv[2
1b580 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d  ]   -> table nam
1b590 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e 5d  e.**   argv[...]
1b5a0 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   -> column names
1b5b0 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
1b5c0 74 20 72 74 72 65 65 49 6e 69 74 28 0a 20 20 73  t rtreeInit(.  s
1b5d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1b600 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
1b610 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1b640 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 2a 20 63   RTREE_COORD_* c
1b650 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e  onstants */.  in
1b660 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1b670 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 20  ar *const*argv, 
1b680 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20    /* Parameters 
1b690 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
1b6a0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73  statement */.  s
1b6b0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
1b6c0 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
1b6d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76     /* OUT: New v
1b6e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
1b6f0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c 20    char **pzErr, 
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
1b720 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66 20  ror message, if 
1b730 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  any */.  int isC
1b740 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b760 54 72 75 65 20 66 6f 72 20 78 43 72 65 61 74 65  True for xCreate
1b770 2c 20 66 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e  , false for xCon
1b780 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nect */.){.  int
1b790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b7a0 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
1b7b0 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20  ;.  int nDb;    
1b7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
1b7d0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72  gth of string ar
1b7e0 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  gv[1] */.  int n
1b7f0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1b800 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
1b810 72 69 6e 67 20 61 72 67 76 5b 32 5d 20 2a 2f 0a  ring argv[2] */.
1b820 20 20 69 6e 74 20 65 43 6f 6f 72 64 54 79 70 65    int eCoordType
1b830 20 3d 20 28 70 41 75 78 20 3f 20 52 54 52 45 45   = (pAux ? RTREE
1b840 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 3a 20 52  _COORD_INT32 : R
1b850 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
1b860 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  2);.  sqlite3_st
1b870 72 20 2a 70 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *pSql;.  char 
1b880 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 69 20  *zSql;.  int ii 
1b890 3d 20 34 3b 0a 20 20 69 6e 74 20 69 45 72 72 3b  = 4;.  int iErr;
1b8a0 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
1b8b0 61 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  aErrMsg[] = {.  
1b8c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a          /* 0 */.
1b900 20 20 20 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65      "Wrong numbe
1b910 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  r of columns for
1b920 20 61 6e 20 72 74 72 65 65 20 74 61 62 6c 65 22   an rtree table"
1b930 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a  ,         /* 1 *
1b940 2f 0a 20 20 20 20 22 54 6f 6f 20 66 65 77 20 63  /.    "Too few c
1b950 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74  olumns for an rt
1b960 72 65 65 20 74 61 62 6c 65 22 2c 20 20 20 20 20  ree table",     
1b970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1b980 20 2a 2f 0a 20 20 20 20 22 54 6f 6f 20 6d 61 6e   */.    "Too man
1b990 79 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e  y columns for an
1b9a0 20 72 74 72 65 65 20 74 61 62 6c 65 22 2c 20 20   rtree table",  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9c0 20 33 20 2a 2f 0a 20 20 20 20 22 41 75 78 69 6c   3 */.    "Auxil
1b9d0 69 61 72 79 20 72 74 72 65 65 20 63 6f 6c 75 6d  iary rtree colum
1b9e0 6e 73 20 6d 75 73 74 20 62 65 20 6c 61 73 74 22  ns must be last"
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 2f 2a 20 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20  /* 4 */.  };..  
1ba10 61 73 73 65 72 74 28 20 52 54 52 45 45 5f 4d 41  assert( RTREE_MA
1ba20 58 5f 41 55 58 5f 43 4f 4c 55 4d 4e 3c 32 35 36  X_AUX_COLUMN<256
1ba30 20 29 3b 20 2f 2a 20 41 75 78 20 63 6f 6c 75 6d   ); /* Aux colum
1ba40 6e 73 20 63 6f 75 6e 74 65 64 20 62 79 20 61 20  ns counted by a 
1ba50 75 38 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 63  u8 */.  if( argc
1ba60 3e 52 54 52 45 45 5f 4d 41 58 5f 41 55 58 5f 43  >RTREE_MAX_AUX_C
1ba70 4f 4c 55 4d 4e 2b 33 20 29 7b 0a 20 20 20 20 2a  OLUMN+3 ){.    *
1ba80 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
1ba90 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 45  mprintf("%s", aE
1baa0 72 72 4d 73 67 5b 33 5d 29 3b 0a 20 20 20 20 72  rrMsg[3]);.    r
1bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bac0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  OR;.  }..  sqlit
1bad0 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28 64  e3_vtab_config(d
1bae0 62 2c 20 53 51 4c 49 54 45 5f 56 54 41 42 5f 43  b, SQLITE_VTAB_C
1baf0 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f 52  ONSTRAINT_SUPPOR
1bb00 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  T, 1);..  /* All
1bb10 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
1bb20 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
1bb30 20 2a 2f 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74   */.  nDb = (int
1bb40 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29  )strlen(argv[1])
1bb50 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74  ;.  nName = (int
1bb60 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29  )strlen(argv[2])
1bb70 3b 0a 20 20 70 52 74 72 65 65 20 3d 20 28 52 74  ;.  pRtree = (Rt
1bb80 72 65 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ree *)sqlite3_ma
1bb90 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 52 74  lloc64(sizeof(Rt
1bba0 72 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32  ree)+nDb+nName+2
1bbb0 29 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65 65  );.  if( !pRtree
1bbc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bbd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1bbe0 0a 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65 65  .  memset(pRtree
1bbf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  , 0, sizeof(Rtre
1bc00 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b  e)+nDb+nName+2);
1bc10 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79  .  pRtree->nBusy
1bc20 20 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d 3e   = 1;.  pRtree->
1bc30 62 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20 26  base.pModule = &
1bc40 72 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20 70  rtreeModule;.  p
1bc50 52 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63 68  Rtree->zDb = (ch
1bc60 61 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d 3b  ar *)&pRtree[1];
1bc70 0a 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65  .  pRtree->zName
1bc80 20 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62 5b   = &pRtree->zDb[
1bc90 6e 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65 65  nDb+1];.  pRtree
1bca0 2d 3e 65 43 6f 6f 72 64 54 79 70 65 20 3d 20 28  ->eCoordType = (
1bcb0 75 38 29 65 43 6f 6f 72 64 54 79 70 65 3b 0a 20  u8)eCoordType;. 
1bcc0 20 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d 3e   memcpy(pRtree->
1bcd0 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44  zDb, argv[1], nD
1bce0 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74  b);.  memcpy(pRt
1bcf0 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76  ree->zName, argv
1bd00 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 0a 20  [2], nName);... 
1bd10 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65   /* Create/Conne
1bd20 63 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ct to the underl
1bd30 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20  ying relational 
1bd40 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1bd50 20 49 66 0a 20 20 2a 2a 20 74 68 61 74 20 69 73   If.  ** that is
1bd60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 61 6c   successful, cal
1bd70 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  l sqlite3_declar
1bd80 65 5f 76 74 61 62 28 29 20 74 6f 20 63 6f 6e 66  e_vtab() to conf
1bd90 69 67 75 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  igure.  ** the r
1bda0 2d 74 72 65 65 20 74 61 62 6c 65 20 73 63 68 65  -tree table sche
1bdb0 6d 61 2e 0a 20 20 2a 2f 0a 20 20 70 53 71 6c 20  ma..  */.  pSql 
1bdc0 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65  = sqlite3_str_ne
1bdd0 77 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  w(db);.  sqlite3
1bde0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53 71  _str_appendf(pSq
1bdf0 6c 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  l, "CREATE TABLE
1be00 20 78 28 25 73 22 2c 20 61 72 67 76 5b 33 5d 29   x(%s", argv[3])
1be10 3b 0a 20 20 66 6f 72 28 69 69 3d 34 3b 20 69 69  ;.  for(ii=4; ii
1be20 3c 61 72 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  <argc; ii++){.  
1be30 20 20 69 66 28 20 61 72 67 76 5b 69 69 5d 5b 30    if( argv[ii][0
1be40 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='+' ){.      
1be50 70 52 74 72 65 65 2d 3e 6e 41 75 78 2b 2b 3b 0a  pRtree->nAux++;.
1be60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
1be70 72 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20  r_appendf(pSql, 
1be80 22 2c 25 73 22 2c 20 61 72 67 76 5b 69 69 5d 2b  ",%s", argv[ii]+
1be90 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
1bea0 28 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 3e 30  ( pRtree->nAux>0
1beb0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1bec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bed0 20 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 2b    pRtree->nDim2+
1bee0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
1bef0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53 71  _str_appendf(pSq
1bf00 6c 2c 20 22 2c 25 73 22 2c 20 61 72 67 76 5b 69  l, ",%s", argv[i
1bf10 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
1bf20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
1bf30 65 6e 64 66 28 70 53 71 6c 2c 20 22 29 3b 22 29  endf(pSql, ");")
1bf40 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1bf50 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 70 53  e3_str_finish(pS
1bf60 71 6c 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c  ql);.  if( !zSql
1bf70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1bf80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
1bf90 73 65 20 69 66 28 20 69 69 3c 61 72 67 63 20 29  se if( ii<argc )
1bfa0 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
1bfb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1bfc0 25 73 22 2c 20 61 45 72 72 4d 73 67 5b 34 5d 29  %s", aErrMsg[4])
1bfd0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1bfe0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
1bff0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c000 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65  (rc = sqlite3_de
1c010 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
1c020 53 71 6c 29 29 20 29 7b 0a 20 20 20 20 2a 70 7a  Sql)) ){.    *pz
1c030 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
1c040 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
1c050 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
1c060 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1c070 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
1c080 20 72 63 20 29 20 67 6f 74 6f 20 72 74 72 65 65   rc ) goto rtree
1c090 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 70 52 74  Init_fail;.  pRt
1c0a0 72 65 65 2d 3e 6e 44 69 6d 20 3d 20 70 52 74 72  ree->nDim = pRtr
1c0b0 65 65 2d 3e 6e 44 69 6d 32 2f 32 3b 0a 20 20 69  ee->nDim2/2;.  i
1c0c0 66 28 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 3c  f( pRtree->nDim<
1c0d0 31 20 29 7b 0a 20 20 20 20 69 45 72 72 20 3d 20  1 ){.    iErr = 
1c0e0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
1c0f0 52 74 72 65 65 2d 3e 6e 44 69 6d 32 3e 52 54 52  Rtree->nDim2>RTR
1c100 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
1c110 53 2a 32 20 29 7b 0a 20 20 20 20 69 45 72 72 20  S*2 ){.    iErr 
1c120 3d 20 33 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 3;.  }else if(
1c130 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 25   pRtree->nDim2 %
1c140 20 32 20 29 7b 0a 20 20 20 20 69 45 72 72 20 3d   2 ){.    iErr =
1c150 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1c160 20 69 45 72 72 20 3d 20 30 3b 0a 20 20 7d 0a 20   iErr = 0;.  }. 
1c170 20 69 66 28 20 69 45 72 72 20 29 7b 0a 20 20 20   if( iErr ){.   
1c180 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
1c190 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1c1a0 61 45 72 72 4d 73 67 5b 69 45 72 72 5d 29 3b 0a  aErrMsg[iErr]);.
1c1b0 20 20 20 20 67 6f 74 6f 20 72 74 72 65 65 49 6e      goto rtreeIn
1c1c0 69 74 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 70  it_fail;.  }.  p
1c1d0 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72  Rtree->nBytesPer
1c1e0 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52 74 72 65  Cell = 8 + pRtre
1c1f0 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 0a 20 20 2f  e->nDim2*4;..  /
1c200 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
1c210 20 6e 6f 64 65 20 73 69 7a 65 20 74 6f 20 75 73   node size to us
1c220 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 67 65 74  e. */.  rc = get
1c230 4e 6f 64 65 53 69 7a 65 28 64 62 2c 20 70 52 74  NodeSize(db, pRt
1c240 72 65 65 2c 20 69 73 43 72 65 61 74 65 2c 20 70  ree, isCreate, p
1c250 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20  zErr);.  if( rc 
1c260 29 20 67 6f 74 6f 20 72 74 72 65 65 49 6e 69 74  ) goto rtreeInit
1c270 5f 66 61 69 6c 3b 0a 20 20 72 63 20 3d 20 72 74  _fail;.  rc = rt
1c280 72 65 65 53 71 6c 49 6e 69 74 28 70 52 74 72 65  reeSqlInit(pRtre
1c290 65 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20  e, db, argv[1], 
1c2a0 61 72 67 76 5b 32 5d 2c 20 69 73 43 72 65 61 74  argv[2], isCreat
1c2b0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1c2c0 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
1c2d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1c2e0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
1c2f0 67 28 64 62 29 29 3b 0a 20 20 20 20 67 6f 74 6f  g(db));.    goto
1c300 20 72 74 72 65 65 49 6e 69 74 5f 66 61 69 6c 3b   rtreeInit_fail;
1c310 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20  .  }..  *ppVtab 
1c320 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  = (sqlite3_vtab 
1c330 2a 29 70 52 74 72 65 65 3b 0a 20 20 72 65 74 75  *)pRtree;.  retu
1c340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 72  rn SQLITE_OK;..r
1c350 74 72 65 65 49 6e 69 74 5f 66 61 69 6c 3a 0a 20  treeInit_fail:. 
1c360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c370 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
1c380 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
1c390 28 20 2a 70 70 56 74 61 62 3d 3d 30 20 29 3b 0a  ( *ppVtab==0 );.
1c3a0 20 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65    assert( pRtree
1c3b0 2d 3e 6e 42 75 73 79 3d 3d 31 20 29 3b 0a 20 20  ->nBusy==1 );.  
1c3c0 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74  rtreeRelease(pRt
1c3d0 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ree);.  return r
1c3e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
1c3f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
1c400 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
1c410 20 74 68 61 74 20 64 65 63 6f 64 65 73 20 72 2d   that decodes r-
1c420 74 72 65 65 20 6e 6f 64 65 73 20 74 6f 0a 2a 2a  tree nodes to.**
1c430 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
1c440 73 74 72 69 6e 67 73 2e 20 54 68 69 73 20 63 61  strings. This ca
1c450 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 65  n be used for de
1c460 62 75 67 67 69 6e 67 20 61 6e 64 20 61 6e 61 6c  bugging and anal
1c470 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ysis..**.** The 
1c480 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
1c490 74 61 6b 65 73 20 74 77 6f 20 61 72 67 75 6d 65  takes two argume
1c4a0 6e 74 73 3a 20 28 31 29 20 74 68 65 20 6e 75 6d  nts: (1) the num
1c4b0 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69 6f 6e  ber of dimension
1c4c0 73 0a 2a 2a 20 74 6f 20 74 68 65 20 72 74 72 65  s.** to the rtre
1c4d0 65 20 28 62 65 74 77 65 65 6e 20 31 20 61 6e 64  e (between 1 and
1c4e0 20 35 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61   5, inclusive) a
1c4f0 6e 64 20 28 32 29 20 61 20 62 6c 6f 62 20 6f 66  nd (2) a blob of
1c500 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 69 6e 67   data containing
1c510 0a 2a 2a 20 61 6e 20 72 2d 74 72 65 65 20 6e 6f  .** an r-tree no
1c520 64 65 2e 20 20 46 6f 72 20 61 20 74 77 6f 2d 64  de.  For a two-d
1c530 69 6d 65 6e 73 69 6f 6e 61 6c 20 72 2d 74 72 65  imensional r-tre
1c540 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6c 6c  e structure call
1c550 65 64 20 22 72 74 22 2c 20 74 6f 0a 2a 2a 20 64  ed "rt", to.** d
1c560 65 73 65 72 69 61 6c 69 7a 65 20 61 6c 6c 20 6e  eserialize all n
1c570 6f 64 65 73 2c 20 61 20 73 74 61 74 65 6d 65 6e  odes, a statemen
1c580 74 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t like:.**.**   
1c590 53 45 4c 45 43 54 20 72 74 72 65 65 6e 6f 64 65  SELECT rtreenode
1c5a0 28 32 2c 20 64 61 74 61 29 20 46 52 4f 4d 20 72  (2, data) FROM r
1c5b0 74 5f 6e 6f 64 65 3b 0a 2a 2a 0a 2a 2a 20 54 68  t_node;.**.** Th
1c5c0 65 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  e human readable
1c5d0 20 73 74 72 69 6e 67 20 74 61 6b 65 73 20 74 68   string takes th
1c5e0 65 20 66 6f 72 6d 20 6f 66 20 61 20 54 63 6c 20  e form of a Tcl 
1c5f0 6c 69 73 74 20 77 69 74 68 20 6f 6e 65 0a 2a 2a  list with one.**
1c600 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1c610 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 2d 74 72  cell in the r-tr
1c620 65 65 20 6e 6f 64 65 2e 20 45 61 63 68 20 65 6e  ee node. Each en
1c630 74 72 79 20 69 73 20 69 74 73 65 6c 66 20 61 0a  try is itself a.
1c640 2a 2a 20 6c 69 73 74 2c 20 63 6f 6e 74 61 69 6e  ** list, contain
1c650 69 6e 67 20 74 68 65 20 38 2d 62 79 74 65 20 72  ing the 8-byte r
1c660 6f 77 69 64 2f 70 61 67 65 6e 6f 20 66 6f 6c 6c  owid/pageno foll
1c670 6f 77 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20  owed by the .** 
1c680 3c 6e 75 6d 2d 64 69 6d 65 6e 73 69 6f 6e 3e 2a  <num-dimension>*
1c690 32 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e 0a 2a  2 coordinates..*
1c6a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
1c6b0 72 65 65 6e 6f 64 65 28 73 71 6c 69 74 65 33 5f  reenode(sqlite3_
1c6c0 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
1c6d0 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
1c6e0 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29 7b 0a  value **apArg){.
1c6f0 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20    char *zText = 
1c700 30 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 6e  0;.  RtreeNode n
1c710 6f 64 65 3b 0a 20 20 52 74 72 65 65 20 74 72 65  ode;.  Rtree tre
1c720 65 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  e;.  int ii;..  
1c730 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c740 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74  (nArg);.  memset
1c750 28 26 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  (&node, 0, sizeo
1c760 66 28 52 74 72 65 65 4e 6f 64 65 29 29 3b 0a 20  f(RtreeNode));. 
1c770 20 6d 65 6d 73 65 74 28 26 74 72 65 65 2c 20 30   memset(&tree, 0
1c780 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 29 29  , sizeof(Rtree))
1c790 3b 0a 20 20 74 72 65 65 2e 6e 44 69 6d 20 3d 20  ;.  tree.nDim = 
1c7a0 28 75 38 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  (u8)sqlite3_valu
1c7b0 65 5f 69 6e 74 28 61 70 41 72 67 5b 30 5d 29 3b  e_int(apArg[0]);
1c7c0 0a 20 20 74 72 65 65 2e 6e 44 69 6d 32 20 3d 20  .  tree.nDim2 = 
1c7d0 74 72 65 65 2e 6e 44 69 6d 2a 32 3b 0a 20 20 74  tree.nDim*2;.  t
1c7e0 72 65 65 2e 6e 42 79 74 65 73 50 65 72 43 65 6c  ree.nBytesPerCel
1c7f0 6c 20 3d 20 38 20 2b 20 38 20 2a 20 74 72 65 65  l = 8 + 8 * tree
1c800 2e 6e 44 69 6d 3b 0a 20 20 6e 6f 64 65 2e 7a 44  .nDim;.  node.zD
1c810 61 74 61 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  ata = (u8 *)sqli
1c820 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1c830 70 41 72 67 5b 31 5d 29 3b 0a 0a 20 20 66 6f 72  pArg[1]);..  for
1c840 28 69 69 3d 30 3b 20 69 69 3c 4e 43 45 4c 4c 28  (ii=0; ii<NCELL(
1c850 26 6e 6f 64 65 29 3b 20 69 69 2b 2b 29 7b 0a 20  &node); ii++){. 
1c860 20 20 20 63 68 61 72 20 7a 43 65 6c 6c 5b 35 31     char zCell[51
1c870 32 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  2];.    int nCel
1c880 6c 20 3d 20 30 3b 0a 20 20 20 20 52 74 72 65 65  l = 0;.    Rtree
1c890 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 69  Cell cell;.    i
1c8a0 6e 74 20 6a 6a 3b 0a 0a 20 20 20 20 6e 6f 64 65  nt jj;..    node
1c8b0 47 65 74 43 65 6c 6c 28 26 74 72 65 65 2c 20 26  GetCell(&tree, &
1c8c0 6e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c 29  node, ii, &cell)
1c8d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1c8e0 70 72 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c  printf(512-nCell
1c8f0 2c 26 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 22  ,&zCell[nCell],"
1c900 25 6c 6c 64 22 2c 20 63 65 6c 6c 2e 69 52 6f 77  %lld", cell.iRow
1c910 69 64 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  id);.    nCell =
1c920 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 65   (int)strlen(zCe
1c930 6c 6c 29 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d  ll);.    for(jj=
1c940 30 3b 20 6a 6a 3c 74 72 65 65 2e 6e 44 69 6d 32  0; jj<tree.nDim2
1c950 3b 20 6a 6a 2b 2b 29 7b 0a 23 69 66 6e 64 65 66  ; jj++){.#ifndef
1c960 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e   SQLITE_RTREE_IN
1c970 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 73 71 6c  T_ONLY.      sql
1c980 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 31  ite3_snprintf(51
1c990 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e  2-nCell,&zCell[n
1c9a0 43 65 6c 6c 5d 2c 20 22 20 25 67 22 2c 0a 20 20  Cell], " %g",.  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 28 64 6f 75 62 6c 65 29 63 65 6c       (double)cel
1c9d0 6c 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 2e 66 29 3b  l.aCoord[jj].f);
1c9e0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 71 6c  .#else.      sql
1c9f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 31  ite3_snprintf(51
1ca00 32 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e  2-nCell,&zCell[n
1ca10 43 65 6c 6c 5d 2c 20 22 20 25 64 22 2c 0a 20 20  Cell], " %d",.  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64       cell.aCoord
1ca40 5b 6a 6a 5d 2e 69 29 3b 0a 23 65 6e 64 69 66 0a  [jj].i);.#endif.
1ca50 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
1ca60 6e 74 29 73 74 72 6c 65 6e 28 7a 43 65 6c 6c 29  nt)strlen(zCell)
1ca70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ca80 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20   zText ){.      
1ca90 63 68 61 72 20 2a 7a 54 65 78 74 4e 65 77 20 3d  char *zTextNew =
1caa0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1cab0 28 22 25 73 20 7b 25 73 7d 22 2c 20 7a 54 65 78  ("%s {%s}", zTex
1cac0 74 2c 20 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, zCell);.     
1cad0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
1cae0 65 78 74 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ext);.      zTex
1caf0 74 20 3d 20 7a 54 65 78 74 4e 65 77 3b 0a 20 20  t = zTextNew;.  
1cb00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1cb10 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Text = sqlite3_m
1cb20 70 72 69 6e 74 66 28 22 7b 25 73 7d 22 2c 20 7a  printf("{%s}", z
1cb30 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Cell);.    }.  }
1cb40 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  .  .  sqlite3_re
1cb50 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 7a  sult_text(ctx, z
1cb60 54 65 78 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65  Text, -1, sqlite
1cb70 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 20 54  3_free);.}../* T
1cb80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1cb90 65 6d 65 6e 74 73 20 61 6e 20 53 51 4c 20 66 75  ements an SQL fu
1cba0 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75  nction that retu
1cbb0 72 6e 73 20 74 68 65 20 22 64 65 70 74 68 22 20  rns the "depth" 
1cbc0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 66 72 6f  parameter.** fro
1cbd0 6d 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 61  m the front of a
1cbe0 20 62 6c 6f 62 20 74 68 61 74 20 69 73 20 61 6e   blob that is an
1cbf0 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 20 46   r-tree node.  F
1cc00 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1cc10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 72 74 72  *     SELECT rtr
1cc20 65 65 64 65 70 74 68 28 64 61 74 61 29 20 46 52  eedepth(data) FR
1cc30 4f 4d 20 72 74 5f 6e 6f 64 65 20 57 48 45 52 45  OM rt_node WHERE
1cc40 20 6e 6f 64 65 6e 6f 3d 31 3b 0a 2a 2a 0a 2a 2a   nodeno=1;.**.**
1cc50 20 54 68 65 20 64 65 70 74 68 20 76 61 6c 75 65   The depth value
1cc60 20 69 73 20 30 20 66 6f 72 20 61 6c 6c 20 6e 6f   is 0 for all no
1cc70 64 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  des other than t
1cc80 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 61 6e  he root node, an
1cc90 64 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 6e 6f  d the root.** no
1cca0 64 65 20 61 6c 77 61 79 73 20 68 61 73 20 6e 6f  de always has no
1ccb0 64 65 6e 6f 3d 31 2c 20 73 6f 20 74 68 65 20 65  deno=1, so the e
1ccc0 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 69 73 20  xample above is 
1ccd0 74 68 65 20 70 72 69 6d 61 72 79 20 75 73 65 20  the primary use 
1cce0 66 6f 72 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  for this.** rout
1ccf0 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ine.  This routi
1cd00 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  ne is intended f
1cd10 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1cd20 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
1cd30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74 72  .static void rtr
1cd40 65 65 64 65 70 74 68 28 73 71 6c 69 74 65 33 5f  eedepth(sqlite3_
1cd50 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
1cd60 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
1cd70 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29 7b 0a  value **apArg){.
1cd80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1cd90 45 52 28 6e 41 72 67 29 3b 0a 20 20 69 66 28 20  ER(nArg);.  if( 
1cda0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1cdb0 70 65 28 61 70 41 72 67 5b 30 5d 29 21 3d 53 51  pe(apArg[0])!=SQ
1cdc0 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20 7c 7c  LITE_BLOB .   ||
1cdd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1cde0 79 74 65 73 28 61 70 41 72 67 5b 30 5d 29 3c 32  ytes(apArg[0])<2
1cdf0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
1ce00 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
1ce10 74 78 2c 20 22 49 6e 76 61 6c 69 64 20 61 72 67  tx, "Invalid arg
1ce20 75 6d 65 6e 74 20 74 6f 20 72 74 72 65 65 64 65  ument to rtreede
1ce30 70 74 68 28 29 22 2c 20 2d 31 29 3b 20 0a 20 20  pth()", -1); .  
1ce40 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 7a  }else{.    u8 *z
1ce50 42 6c 6f 62 20 3d 20 28 75 38 20 2a 29 73 71 6c  Blob = (u8 *)sql
1ce60 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
1ce70 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 73  apArg[0]);.    s
1ce80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1ce90 74 28 63 74 78 2c 20 72 65 61 64 49 6e 74 31 36  t(ctx, readInt16
1cea0 28 7a 42 6c 6f 62 29 29 3b 0a 20 20 7d 0a 7d 0a  (zBlob));.  }.}.
1ceb0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
1cec0 62 6a 65 63 74 20 70 61 73 73 65 64 20 62 65 74  bject passed bet
1ced0 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73  ween the various
1cee0 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
1cef0 61 6b 65 20 75 70 20 74 68 65 0a 2a 2a 20 69 6d  ake up the.** im
1cf00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1cf10 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
1cf20 66 75 6e 63 74 69 6f 6e 20 72 74 72 65 65 63 68  function rtreech
1cf30 65 63 6b 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65  eck()..*/.typede
1cf40 66 20 73 74 72 75 63 74 20 52 74 72 65 65 43 68  f struct RtreeCh
1cf50 65 63 6b 20 52 74 72 65 65 43 68 65 63 6b 3b 0a  eck RtreeCheck;.
1cf60 73 74 72 75 63 74 20 52 74 72 65 65 43 68 65 63  struct RtreeChec
1cf70 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  k {.  sqlite3 *d
1cf80 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1cf90 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1cfa0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
1cfb0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfd0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
1cfe0 6e 69 6e 67 20 72 74 72 65 65 20 74 61 62 6c 65  ning rtree table
1cff0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1d000 20 2a 7a 54 61 62 3b 20 20 20 20 20 20 20 20 20   *zTab;         
1d010 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d020 20 72 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a   rtree table */.
1d030 20 20 69 6e 74 20 62 49 6e 74 3b 20 20 20 20 20    int bInt;     
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 74    /* True for rt
1d060 72 65 65 5f 69 33 32 20 74 61 62 6c 65 20 2a 2f  ree_i32 table */
1d070 0a 20 20 69 6e 74 20 6e 44 69 6d 3b 20 20 20 20  .  int nDim;    
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d0a0 64 69 6d 65 6e 73 69 6f 6e 73 20 66 6f 72 20 74  dimensions for t
1d0b0 68 69 73 20 72 74 72 65 65 20 74 62 6c 20 2a 2f  his rtree tbl */
1d0c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1d0d0 2a 70 47 65 74 4e 6f 64 65 3b 20 20 20 20 20 20  *pGetNode;      
1d0e0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
1d0f0 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
1d100 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   nodes */.  sqli
1d110 74 65 33 5f 73 74 6d 74 20 2a 61 43 68 65 63 6b  te3_stmt *aCheck
1d120 4d 61 70 70 69 6e 67 5b 32 5d 3b 20 2f 2a 20 53  Mapping[2]; /* S
1d130 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 71 75 65  tatements to que
1d140 72 79 20 25 5f 70 61 72 65 6e 74 2f 25 5f 72 6f  ry %_parent/%_ro
1d150 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  wid */.  int nLe
1d160 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
1d170 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d180 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
1d190 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69   in table */.  i
1d1a0 6e 74 20 6e 4e 6f 6e 4c 65 61 66 3b 20 20 20 20  nt nNonLeaf;    
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d1c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
1d1d0 6c 65 61 66 20 63 65 6c 6c 73 20 69 6e 20 74 61  leaf cells in ta
1d1e0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ble */.  int rc;
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d210 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
1d220 72 20 2a 7a 52 65 70 6f 72 74 3b 20 20 20 20 20  r *zReport;     
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d240 4d 65 73 73 61 67 65 20 74 6f 20 72 65 70 6f 72  Message to repor
1d250 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  t */.  int nErr;
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d280 20 6f 66 20 6c 69 6e 65 73 20 69 6e 20 7a 52 65   of lines in zRe
1d290 70 6f 72 74 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  port */.};..#def
1d2a0 69 6e 65 20 52 54 52 45 45 5f 43 48 45 43 4b 5f  ine RTREE_CHECK_
1d2b0 4d 41 58 5f 45 52 52 4f 52 20 31 30 30 0a 0a 2f  MAX_ERROR 100../
1d2c0 2a 0a 2a 2a 20 52 65 73 65 74 20 53 51 4c 20 73  *.** Reset SQL s
1d2d0 74 61 74 65 6d 65 6e 74 20 70 53 74 6d 74 2e 20  tatement pStmt. 
1d2e0 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  If the sqlite3_r
1d2f0 65 73 65 74 28 29 20 63 61 6c 6c 20 72 65 74 75  eset() call retu
1d300 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 0a 2a 2a  rns an error,.**
1d310 20 61 6e 64 20 52 74 72 65 65 43 68 65 63 6b 2e   and RtreeCheck.
1d320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  rc==SQLITE_OK, s
1d330 65 74 20 52 74 72 65 65 43 68 65 63 6b 2e 72 63  et RtreeCheck.rc
1d340 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f   to the error co
1d350 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
1d360 69 64 20 72 74 72 65 65 43 68 65 63 6b 52 65 73  id rtreeCheckRes
1d370 65 74 28 52 74 72 65 65 43 68 65 63 6b 20 2a 70  et(RtreeCheck *p
1d380 43 68 65 63 6b 2c 20 73 71 6c 69 74 65 33 5f 73  Check, sqlite3_s
1d390 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69  tmt *pStmt){.  i
1d3a0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1d3b0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
1d3c0 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d  if( pCheck->rc==
1d3d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 43 68 65  SQLITE_OK ) pChe
1d3e0 63 6b 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 0a  ck->rc = rc;.}..
1d3f0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
1d400 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
1d410 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69  arguments to thi
1d420 73 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 61  s function are a
1d430 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 0a 2a   format string.*
1d440 2a 20 61 6e 64 20 70 72 69 6e 74 66 20 73 74 79  * and printf sty
1d450 6c 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68  le arguments. Th
1d460 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 6d  is function form
1d470 61 74 73 20 74 68 65 20 73 74 72 69 6e 67 20 61  ats the string a
1d480 6e 64 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nd attempts.** t
1d490 6f 20 63 6f 6d 70 69 6c 65 20 69 74 20 61 73 20  o compile it as 
1d4a0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1d4b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1d4c0 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72  ssful, a pointer
1d4d0 20 74 6f 20 74 68 65 20 6e 65 77 20 53 51 4c 20   to the new SQL 
1d4e0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 74  statement is ret
1d4f0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1d500 2c 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  ,.** NULL is ret
1d510 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
1d520 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
1d530 52 74 72 65 65 43 68 65 63 6b 2e 72 63 2e 0a 2a  RtreeCheck.rc..*
1d540 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1d550 5f 73 74 6d 74 20 2a 72 74 72 65 65 43 68 65 63  _stmt *rtreeChec
1d560 6b 50 72 65 70 61 72 65 28 0a 20 20 52 74 72 65  kPrepare(.  Rtre
1d570 65 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20  eCheck *pCheck, 
1d580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d590 74 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74  treeCheck object
1d5a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1d5b0 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 20 20 20 20 20   *zFmt, ...     
1d5c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20        /* Format 
1d5d0 73 74 72 69 6e 67 20 61 6e 64 20 74 72 61 69 6c  string and trail
1d5e0 69 6e 67 20 61 72 67 73 20 2a 2f 0a 29 7b 0a 20  ing args */.){. 
1d5f0 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1d600 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65  har *z;.  sqlite
1d610 33 5f 73 74 6d 74 20 2a 70 52 65 74 20 3d 20 30  3_stmt *pRet = 0
1d620 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ;..  va_start(ap
1d630 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73  , zFmt);.  z = s
1d640 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
1d650 7a 46 6d 74 2c 20 61 70 29 3b 0a 0a 20 20 69 66  zFmt, ap);..  if
1d660 28 20 70 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51  ( pCheck->rc==SQ
1d670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1d680 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
1d690 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d 20 53 51   pCheck->rc = SQ
1d6a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 68  }else{.      pCh
1d6c0 65 63 6b 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65  eck->rc = sqlite
1d6d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 68  3_prepare_v2(pCh
1d6e0 65 63 6b 2d 3e 64 62 2c 20 7a 2c 20 2d 31 2c 20  eck->db, z, -1, 
1d6f0 26 70 52 65 74 2c 20 30 29 3b 0a 20 20 20 20 7d  &pRet, 0);.    }
1d700 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1d710 66 72 65 65 28 7a 29 3b 0a 20 20 76 61 5f 65 6e  free(z);.  va_en
1d720 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
1d730 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
1d740 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  he second and su
1d750 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
1d760 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ts to this funct
1d770 69 6f 6e 20 61 72 65 20 61 20 70 72 69 6e 74 66  ion are a printf
1d780 28 29 0a 2a 2a 20 73 74 79 6c 65 20 66 6f 72 6d  ().** style form
1d790 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 61 72  at string and ar
1d7a0 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 66 75  guments. This fu
1d7b0 6e 63 74 69 6f 6e 20 66 6f 72 6d 61 74 73 20 74  nction formats t
1d7c0 68 65 20 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a  he string and.**
1d7d0 20 61 70 70 65 6e 64 73 20 69 74 20 74 6f 20 74   appends it to t
1d7e0 68 65 20 72 65 70 6f 72 74 20 62 65 69 6e 67 20  he report being 
1d7f0 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 70 43  accumuated in pC
1d800 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
1d810 76 6f 69 64 20 72 74 72 65 65 43 68 65 63 6b 41  void rtreeCheckA
1d820 70 70 65 6e 64 4d 73 67 28 52 74 72 65 65 43 68  ppendMsg(RtreeCh
1d830 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 63 6f 6e  eck *pCheck, con
1d840 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
1d850 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1d860 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1d870 2c 20 7a 46 6d 74 29 3b 0a 20 20 69 66 28 20 70  , zFmt);.  if( p
1d880 43 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54  Check->rc==SQLIT
1d890 45 5f 4f 4b 20 26 26 20 70 43 68 65 63 6b 2d 3e  E_OK && pCheck->
1d8a0 6e 45 72 72 3c 52 54 52 45 45 5f 43 48 45 43 4b  nErr<RTREE_CHECK
1d8b0 5f 4d 41 58 5f 45 52 52 4f 52 20 29 7b 0a 20 20  _MAX_ERROR ){.  
1d8c0 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
1d8d0 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
1d8e0 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20  t, ap);.    if( 
1d8f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  z==0 ){.      pC
1d900 68 65 63 6b 2d 3e 72 63 20 3d 20 53 51 4c 49 54  heck->rc = SQLIT
1d910 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1d920 73 65 7b 0a 20 20 20 20 20 20 70 43 68 65 63 6b  se{.      pCheck
1d930 2d 3e 7a 52 65 70 6f 72 74 20 3d 20 73 71 6c 69  ->zReport = sqli
1d940 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
1d950 73 25 7a 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%z", .         
1d960 20 70 43 68 65 63 6b 2d 3e 7a 52 65 70 6f 72 74   pCheck->zReport
1d970 2c 20 28 70 43 68 65 63 6b 2d 3e 7a 52 65 70 6f  , (pCheck->zRepo
1d980 72 74 20 3f 20 22 5c 6e 22 20 3a 20 22 22 29 2c  rt ? "\n" : ""),
1d990 20 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   z.      );.    
1d9a0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 52    if( pCheck->zR
1d9b0 65 70 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eport==0 ){.    
1d9c0 20 20 20 20 70 43 68 65 63 6b 2d 3e 72 63 20 3d      pCheck->rc =
1d9d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d9e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d9f0 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b   pCheck->nErr++;
1da00 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1da10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1da20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1da30 6f 2d 6f 70 20 69 66 20 74 68 65 72 65 20 69 73  o-op if there is
1da40 20 61 6c 72 65 61 64 79 20 61 6e 20 65 72 72 6f   already an erro
1da50 72 20 63 6f 64 65 20 73 74 6f 72 65 64 0a 2a 2a  r code stored.**
1da60 20 69 6e 20 74 68 65 20 52 74 72 65 65 43 68 65   in the RtreeChe
1da70 63 6b 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  ck object indica
1da80 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ted by the first
1da90 20 61 72 67 75 6d 65 6e 74 2e 20 4e 55 4c 4c 20   argument. NULL 
1daa0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
1dab0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1dac0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
1dad0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 72 74  e contents of rt
1dae0 72 65 65 20 74 61 62 6c 65 20 6e 6f 64 65 20 69  ree table node i
1daf0 4e 6f 64 65 20 61 72 65 20 6c 6f 61 64 65 64 20  Node are loaded 
1db00 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 64 61 74 61  from.** the data
1db10 62 61 73 65 20 61 6e 64 20 63 6f 70 69 65 64 20  base and copied 
1db20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20 6f 62  into a buffer ob
1db30 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1db40 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
1db50 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1db60 75 72 73 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  urs, a pointer t
1db70 6f 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  o the buffer is 
1db80 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28 2a 70  returned and (*p
1db90 6e 4e 6f 64 65 29 0a 2a 2a 20 69 73 20 73 65 74  nNode).** is set
1dba0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1dbb0 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 62 79  the buffer in by
1dbc0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  tes..**.** Or, i
1dbd0 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
1dbe0 6f 63 63 75 72 2c 20 4e 55 4c 4c 20 69 73 20 72  occur, NULL is r
1dbf0 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
1dc00 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 0a 2a  rror code left.*
1dc10 2a 20 69 6e 20 74 68 65 20 52 74 72 65 65 43 68  * in the RtreeCh
1dc20 65 63 6b 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  eck object. The 
1dc30 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
1dc40 70 6e 4e 6f 64 65 20 69 73 20 75 6e 64 65 66 69  pnNode is undefi
1dc50 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63  ned in.** this c
1dc60 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ase..*/.static u
1dc70 38 20 2a 72 74 72 65 65 43 68 65 63 6b 47 65 74  8 *rtreeCheckGet
1dc80 4e 6f 64 65 28 52 74 72 65 65 43 68 65 63 6b 20  Node(RtreeCheck 
1dc90 2a 70 43 68 65 63 6b 2c 20 69 36 34 20 69 4e 6f  *pCheck, i64 iNo
1dca0 64 65 2c 20 69 6e 74 20 2a 70 6e 4e 6f 64 65 29  de, int *pnNode)
1dcb0 7b 0a 20 20 75 38 20 2a 70 52 65 74 20 3d 20 30  {.  u8 *pRet = 0
1dcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dcd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1dce0 6c 75 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 43  lue */..  if( pC
1dcf0 68 65 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  heck->rc==SQLITE
1dd00 5f 4f 4b 20 26 26 20 70 43 68 65 63 6b 2d 3e 70  _OK && pCheck->p
1dd10 47 65 74 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  GetNode==0 ){.  
1dd20 20 20 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e 6f    pCheck->pGetNo
1dd30 64 65 20 3d 20 72 74 72 65 65 43 68 65 63 6b 50  de = rtreeCheckP
1dd40 72 65 70 61 72 65 28 70 43 68 65 63 6b 2c 0a 20  repare(pCheck,. 
1dd50 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 64         "SELECT d
1dd60 61 74 61 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ata FROM %Q.'%q_
1dd70 6e 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65  node' WHERE node
1dd80 6e 6f 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20  no=?", .        
1dd90 70 43 68 65 63 6b 2d 3e 7a 44 62 2c 20 70 43 68  pCheck->zDb, pCh
1dda0 65 63 6b 2d 3e 7a 54 61 62 0a 20 20 20 20 29 3b  eck->zTab.    );
1ddb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 68 65  .  }..  if( pChe
1ddc0 63 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ck->rc==SQLITE_O
1ddd0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1dde0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 65  _bind_int64(pChe
1ddf0 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 2c 20 31 2c  ck->pGetNode, 1,
1de00 20 69 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28   iNode);.    if(
1de10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
1de20 68 65 63 6b 2d 3e 70 47 65 74 4e 6f 64 65 29 3d  heck->pGetNode)=
1de30 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1de40 20 20 20 20 20 69 6e 74 20 6e 4e 6f 64 65 20 3d       int nNode =
1de50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1de60 62 79 74 65 73 28 70 43 68 65 63 6b 2d 3e 70 47  bytes(pCheck->pG
1de70 65 74 4e 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20  etNode, 0);.    
1de80 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 6f 64    const u8 *pNod
1de90 65 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 73  e = (const u8*)s
1dea0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1deb0 6f 62 28 70 43 68 65 63 6b 2d 3e 70 47 65 74 4e  ob(pCheck->pGetN
1dec0 6f 64 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ode, 0);.      p
1ded0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
1dee0 6c 6c 6f 63 36 34 28 6e 4e 6f 64 65 29 3b 0a 20  lloc64(nNode);. 
1def0 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30       if( pRet==0
1df00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 68 65   ){.        pChe
1df10 63 6b 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  ck->rc = SQLITE_
1df20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
1df30 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
1df40 70 79 28 70 52 65 74 2c 20 70 4e 6f 64 65 2c 20  py(pRet, pNode, 
1df50 6e 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  nNode);.        
1df60 2a 70 6e 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b  *pnNode = nNode;
1df70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1df80 20 20 20 72 74 72 65 65 43 68 65 63 6b 52 65 73     rtreeCheckRes
1df90 65 74 28 70 43 68 65 63 6b 2c 20 70 43 68 65 63  et(pCheck, pChec
1dfa0 6b 2d 3e 70 47 65 74 4e 6f 64 65 29 3b 0a 20 20  k->pGetNode);.  
1dfb0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 72 63    if( pCheck->rc
1dfc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1dfd0 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
1dfe0 72 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64  rtreeCheckAppend
1dff0 4d 73 67 28 70 43 68 65 63 6b 2c 20 22 4e 6f 64  Msg(pCheck, "Nod
1e000 65 20 25 6c 6c 64 20 6d 69 73 73 69 6e 67 20 66  e %lld missing f
1e010 72 6f 6d 20 64 61 74 61 62 61 73 65 22 2c 20 69  rom database", i
1e020 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Node);.    }.  }
1e030 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
1e040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e050 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1e060 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  to check that th
1e070 65 20 25 5f 70 61 72 65 6e 74 20 28 69 66 20 62  e %_parent (if b
1e080 4c 65 61 66 3d 3d 30 29 20 6f 72 20 25 5f 72 6f  Leaf==0) or %_ro
1e090 77 69 64 0a 2a 2a 20 28 69 66 20 62 4c 65 61 66  wid.** (if bLeaf
1e0a0 3d 3d 31 29 20 74 61 62 6c 65 20 63 6f 6e 74 61  ==1) table conta
1e0b0 69 6e 73 20 61 20 73 70 65 63 69 66 69 65 64 20  ins a specified 
1e0c0 65 6e 74 72 79 2e 20 54 68 65 20 73 63 68 65 6d  entry. The schem
1e0d0 61 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  as of the.** two
1e0e0 20 74 61 62 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a   tables are:.**.
1e0f0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1e100 45 20 25 5f 70 61 72 65 6e 74 28 6e 6f 64 65 6e  E %_parent(noden
1e110 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
1e120 59 20 4b 45 59 2c 20 70 61 72 65 6e 74 6e 6f 64  Y KEY, parentnod
1e130 65 20 49 4e 54 45 47 45 52 29 0a 2a 2a 20 20 20  e INTEGER).**   
1e140 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 72  CREATE TABLE %_r
1e150 6f 77 69 64 28 72 6f 77 69 64 20 49 4e 54 45 47  owid(rowid INTEG
1e160 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1e170 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 2c 20  nodeno INTEGER, 
1e180 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  ...).**.** In bo
1e190 74 68 20 63 61 73 65 73 2c 20 74 68 69 73 20 66  th cases, this f
1e1a0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
1e1b0 68 61 74 20 74 68 65 72 65 20 65 78 69 73 74 73  hat there exists
1e1c0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a 2a   an entry with.*
1e1d0 2a 20 49 50 4b 20 76 61 6c 75 65 20 69 4b 65 79  * IPK value iKey
1e1e0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
1e1f0 63 6f 6c 75 6d 6e 20 73 65 74 20 74 6f 20 69 56  column set to iV
1e200 61 6c 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  al..**.*/.static
1e210 20 76 6f 69 64 20 72 74 72 65 65 43 68 65 63 6b   void rtreeCheck
1e220 4d 61 70 70 69 6e 67 28 0a 20 20 52 74 72 65 65  Mapping(.  Rtree
1e230 43 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 20 20  Check *pCheck,  
1e240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 74             /* Rt
1e250 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 20  reeCheck object 
1e260 2a 2f 0a 20 20 69 6e 74 20 62 4c 65 61 66 2c 20  */.  int bLeaf, 
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1e290 20 61 20 6c 65 61 66 20 63 65 6c 6c 2c 20 66 61   a leaf cell, fa
1e2a0 6c 73 65 20 66 6f 72 20 69 6e 74 65 72 69 6f 72  lse for interior
1e2b0 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 2c 20   */.  i64 iKey, 
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72        /* Key for
1e2e0 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36   mapping */.  i6
1e2f0 34 20 69 56 61 6c 20 20 20 20 20 20 20 20 20 20  4 iVal          
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e310 20 45 78 70 65 63 74 65 64 20 76 61 6c 75 65 20   Expected value 
1e320 66 6f 72 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 29  for mapping */.)
1e330 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1e340 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e350 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
1e360 2a 61 7a 53 71 6c 5b 32 5d 20 3d 20 7b 0a 20 20  *azSql[2] = {.  
1e370 20 20 22 53 45 4c 45 43 54 20 70 61 72 65 6e 74    "SELECT parent
1e380 6e 6f 64 65 20 46 52 4f 4d 20 25 51 2e 27 25 71  node FROM %Q.'%q
1e390 5f 70 61 72 65 6e 74 27 20 57 48 45 52 45 20 6e  _parent' WHERE n
1e3a0 6f 64 65 6e 6f 3d 3f 31 22 2c 0a 20 20 20 20 22  odeno=?1",.    "
1e3b0 53 45 4c 45 43 54 20 6e 6f 64 65 6e 6f 20 46 52  SELECT nodeno FR
1e3c0 4f 4d 20 25 51 2e 27 25 71 5f 72 6f 77 69 64 27  OM %Q.'%q_rowid'
1e3d0 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f 31 22   WHERE rowid=?1"
1e3e0 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  };..  assert(
1e3f0 20 62 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4c 65   bLeaf==0 || bLe
1e400 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  af==1 );.  if( p
1e410 43 68 65 63 6b 2d 3e 61 43 68 65 63 6b 4d 61 70  Check->aCheckMap
1e420 70 69 6e 67 5b 62 4c 65 61 66 5d 3d 3d 30 20 29  ping[bLeaf]==0 )
1e430 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 61 43  {.    pCheck->aC
1e440 68 65 63 6b 4d 61 70 70 69 6e 67 5b 62 4c 65 61  heckMapping[bLea
1e450 66 5d 20 3d 20 72 74 72 65 65 43 68 65 63 6b 50  f] = rtreeCheckP
1e460 72 65 70 61 72 65 28 70 43 68 65 63 6b 2c 0a 20  repare(pCheck,. 
1e470 20 20 20 20 20 20 20 61 7a 53 71 6c 5b 62 4c 65         azSql[bLe
1e480 61 66 5d 2c 20 70 43 68 65 63 6b 2d 3e 7a 44 62  af], pCheck->zDb
1e490 2c 20 70 43 68 65 63 6b 2d 3e 7a 54 61 62 0a 20  , pCheck->zTab. 
1e4a0 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
1e4b0 70 43 68 65 63 6b 2d 3e 72 63 21 3d 53 51 4c 49  pCheck->rc!=SQLI
1e4c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
1e4d0 0a 20 20 70 53 74 6d 74 20 3d 20 70 43 68 65 63  .  pStmt = pChec
1e4e0 6b 2d 3e 61 43 68 65 63 6b 4d 61 70 70 69 6e 67  k->aCheckMapping
1e4f0 5b 62 4c 65 61 66 5d 3b 0a 20 20 73 71 6c 69 74  [bLeaf];.  sqlit
1e500 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
1e510 74 6d 74 2c 20 31 2c 20 69 4b 65 79 29 3b 0a 20  tmt, 1, iKey);. 
1e520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
1e530 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ep(pStmt);.  if(
1e540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1e550 20 29 7b 0a 20 20 20 20 72 74 72 65 65 43 68 65   ){.    rtreeChe
1e560 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
1e570 63 6b 2c 20 22 4d 61 70 70 69 6e 67 20 28 25 6c  ck, "Mapping (%l
1e580 6c 64 20 2d 3e 20 25 6c 6c 64 29 20 6d 69 73 73  ld -> %lld) miss
1e590 69 6e 67 20 66 72 6f 6d 20 25 73 20 74 61 62 6c  ing from %s tabl
1e5a0 65 22 2c 0a 20 20 20 20 20 20 20 20 69 4b 65 79  e",.        iKey
1e5b0 2c 20 69 56 61 6c 2c 20 28 62 4c 65 61 66 20 3f  , iVal, (bLeaf ?
1e5c0 20 22 25 5f 72 6f 77 69 64 22 20 3a 20 22 25 5f   "%_rowid" : "%_
1e5d0 70 61 72 65 6e 74 22 29 0a 20 20 20 20 29 3b 0a  parent").    );.
1e5e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1e5f0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1e600 20 20 69 36 34 20 69 69 20 3d 20 73 71 6c 69 74    i64 ii = sqlit
1e610 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1e620 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1e630 66 28 20 69 69 21 3d 69 56 61 6c 20 29 7b 0a 20  f( ii!=iVal ){. 
1e640 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 41       rtreeCheckA
1e650 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
1e660 20 0a 20 20 20 20 20 20 20 20 20 20 22 46 6f 75   .          "Fou
1e670 6e 64 20 28 25 6c 6c 64 20 2d 3e 20 25 6c 6c 64  nd (%lld -> %lld
1e680 29 20 69 6e 20 25 73 20 74 61 62 6c 65 2c 20 65  ) in %s table, e
1e690 78 70 65 63 74 65 64 20 28 25 6c 6c 64 20 2d 3e  xpected (%lld ->
1e6a0 20 25 6c 6c 64 29 22 2c 0a 20 20 20 20 20 20 20   %lld)",.       
1e6b0 20 20 20 69 4b 65 79 2c 20 69 69 2c 20 28 62 4c     iKey, ii, (bL
1e6c0 65 61 66 20 3f 20 22 25 5f 72 6f 77 69 64 22 20  eaf ? "%_rowid" 
1e6d0 3a 20 22 25 5f 70 61 72 65 6e 74 22 29 2c 20 69  : "%_parent"), i
1e6e0 4b 65 79 2c 20 69 56 61 6c 0a 20 20 20 20 20 20  Key, iVal.      
1e6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1e700 74 72 65 65 43 68 65 63 6b 52 65 73 65 74 28 70  treeCheckReset(p
1e710 43 68 65 63 6b 2c 20 70 53 74 6d 74 29 3b 0a 7d  Check, pStmt);.}
1e720 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1e730 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
1e740 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 6f 6f   an array of coo
1e750 72 64 69 6e 61 74 65 73 20 73 74 6f 72 65 64 20  rdinates stored 
1e760 6f 6e 20 61 6e 20 72 74 72 65 65 20 70 61 67 65  on an rtree page
1e770 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
1e780 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
1e790 68 65 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 61  he coordinates a
1e7a0 72 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  re internally co
1e7b0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 0a 2a 2a 20  nsistent (no.** 
1e7c0 78 31 3e 78 32 20 63 6f 6e 64 69 74 69 6f 6e 73  x1>x2 conditions
1e7d0 29 20 61 6e 64 20 61 64 64 73 20 61 6e 20 65 72  ) and adds an er
1e7e0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 74  ror message to t
1e7f0 68 65 20 52 74 72 65 65 43 68 65 63 6b 20 6f 62  he RtreeCheck ob
1e800 6a 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 79 20  ject.** if they 
1e810 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 41  are not..**.** A
1e820 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20  dditionally, if 
1e830 70 50 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e  pParent is not N
1e840 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
1e850 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
1e860 20 74 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   to.** the array
1e870 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65 73 20   of coordinates 
1e880 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  on the parent pa
1e890 67 65 20 74 68 61 74 20 62 6f 75 6e 64 20 74 68  ge that bound th
1e8a0 65 20 70 61 67 65 20 0a 2a 2a 20 63 6f 6e 74 61  e page .** conta
1e8b0 69 6e 69 6e 67 20 70 43 65 6c 6c 2e 20 49 6e 20  ining pCell. In 
1e8c0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1e8d0 61 6c 73 6f 20 76 65 72 69 66 69 65 64 20 74 68  also verified th
1e8e0 61 74 20 74 68 65 20 74 77 6f 0a 2a 2a 20 73 65  at the two.** se
1e8f0 74 73 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65  ts of coordinate
1e900 73 20 61 72 65 20 6d 75 74 75 61 6c 6c 79 20 63  s are mutually c
1e910 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 61 6e  onsistent and an
1e920 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
1e930 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 52  dded.** to the R
1e940 74 72 65 65 43 68 65 63 6b 20 6f 62 6a 65 63 74  treeCheck object
1e950 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
1e960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e970 20 72 74 72 65 65 43 68 65 63 6b 43 65 6c 6c 43   rtreeCheckCellC
1e980 6f 6f 72 64 28 0a 20 20 52 74 72 65 65 43 68 65  oord(.  RtreeChe
1e990 63 6b 20 2a 70 43 68 65 63 6b 2c 20 0a 20 20 69  ck *pCheck, .  i
1e9a0 36 34 20 69 4e 6f 64 65 2c 20 20 20 20 20 20 20  64 iNode,       
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e9c0 2a 20 4e 6f 64 65 20 69 64 20 74 6f 20 75 73 65  * Node id to use
1e9d0 20 69 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   in error messag
1e9e0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  es */.  int iCel
1e9f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1ea00 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
1ea10 6e 75 6d 62 65 72 20 74 6f 20 75 73 65 20 69 6e  number to use in
1ea20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1ea30 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ea60 74 6f 20 63 65 6c 6c 20 63 6f 6f 72 64 69 6e 61  to cell coordina
1ea70 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 50 61  tes */.  u8 *pPa
1ea80 72 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  rent            
1ea90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1eaa0 74 65 72 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ter to parent co
1eab0 6f 72 64 69 6e 61 74 65 73 20 2a 2f 0a 29 7b 0a  ordinates */.){.
1eac0 20 20 52 74 72 65 65 43 6f 6f 72 64 20 63 31 2c    RtreeCoord c1,
1ead0 20 63 32 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72   c2;.  RtreeCoor
1eae0 64 20 70 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20  d p1, p2;.  int 
1eaf0 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  i;..  for(i=0; i
1eb00 3c 70 43 68 65 63 6b 2d 3e 6e 44 69 6d 3b 20 69  <pCheck->nDim; i
1eb10 2b 2b 29 7b 0a 20 20 20 20 72 65 61 64 43 6f 6f  ++){.    readCoo
1eb20 72 64 28 26 70 43 65 6c 6c 5b 34 2a 32 2a 69 5d  rd(&pCell[4*2*i]
1eb30 2c 20 26 63 31 29 3b 0a 20 20 20 20 72 65 61 64  , &c1);.    read
1eb40 43 6f 6f 72 64 28 26 70 43 65 6c 6c 5b 34 2a 28  Coord(&pCell[4*(
1eb50 32 2a 69 20 2b 20 31 29 5d 2c 20 26 63 32 29 3b  2*i + 1)], &c2);
1eb60 0a 0a 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28  ..    /* printf(
1eb70 22 25 65 2c 20 25 65 5c 6e 22 2c 20 63 31 2e 75  "%e, %e\n", c1.u
1eb80 2e 66 2c 20 63 32 2e 75 2e 66 29 3b 20 2a 2f 0a  .f, c2.u.f); */.
1eb90 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
1eba0 62 49 6e 74 20 3f 20 63 31 2e 69 3e 63 32 2e 69  bInt ? c1.i>c2.i
1ebb0 20 3a 20 63 31 2e 66 3e 63 32 2e 66 20 29 7b 0a   : c1.f>c2.f ){.
1ebc0 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63 6b        rtreeCheck
1ebd0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
1ebe0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 44 69  , .          "Di
1ebf0 6d 65 6e 73 69 6f 6e 20 25 64 20 6f 66 20 63 65  mension %d of ce
1ec00 6c 6c 20 25 64 20 6f 6e 20 6e 6f 64 65 20 25 6c  ll %d on node %l
1ec10 6c 64 20 69 73 20 63 6f 72 72 75 70 74 22 2c 20  ld is corrupt", 
1ec20 69 2c 20 69 43 65 6c 6c 2c 20 69 4e 6f 64 65 0a  i, iCell, iNode.
1ec30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
1ec40 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
1ec50 29 7b 0a 20 20 20 20 20 20 72 65 61 64 43 6f 6f  ){.      readCoo
1ec60 72 64 28 26 70 50 61 72 65 6e 74 5b 34 2a 32 2a  rd(&pParent[4*2*
1ec70 69 5d 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20  i], &p1);.      
1ec80 72 65 61 64 43 6f 6f 72 64 28 26 70 50 61 72 65  readCoord(&pPare
1ec90 6e 74 5b 34 2a 28 32 2a 69 20 2b 20 31 29 5d 2c  nt[4*(2*i + 1)],
1eca0 20 26 70 32 29 3b 0a 0a 20 20 20 20 20 20 69 66   &p2);..      if
1ecb0 28 20 28 70 43 68 65 63 6b 2d 3e 62 49 6e 74 20  ( (pCheck->bInt 
1ecc0 3f 20 63 31 2e 69 3c 70 31 2e 69 20 3a 20 63 31  ? c1.i<p1.i : c1
1ecd0 2e 66 3c 70 31 2e 66 29 20 0a 20 20 20 20 20 20  .f<p1.f) .      
1ece0 20 7c 7c 20 28 70 43 68 65 63 6b 2d 3e 62 49 6e   || (pCheck->bIn
1ecf0 74 20 3f 20 63 32 2e 69 3e 70 32 2e 69 20 3a 20  t ? c2.i>p2.i : 
1ed00 63 32 2e 66 3e 70 32 2e 66 29 0a 20 20 20 20 20  c2.f>p2.f).     
1ed10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 74 72 65   ){.        rtre
1ed20 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28  eCheckAppendMsg(
1ed30 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
1ed40 20 20 20 20 20 22 44 69 6d 65 6e 73 69 6f 6e 20       "Dimension 
1ed50 25 64 20 6f 66 20 63 65 6c 6c 20 25 64 20 6f 6e  %d of cell %d on
1ed60 20 6e 6f 64 65 20 25 6c 6c 64 20 69 73 20 63 6f   node %lld is co
1ed70 72 72 75 70 74 20 72 65 6c 61 74 69 76 65 20 74  rrupt relative t
1ed80 6f 20 70 61 72 65 6e 74 22 0a 20 20 20 20 20 20  o parent".      
1ed90 20 20 20 20 20 20 2c 20 69 2c 20 69 43 65 6c 6c        , i, iCell
1eda0 2c 20 69 4e 6f 64 65 0a 20 20 20 20 20 20 20 20  , iNode.        
1edb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1edc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  .  }.}../*.** Ru
1edd0 6e 20 72 74 72 65 65 63 68 65 63 6b 28 29 20 63  n rtreecheck() c
1ede0 68 65 63 6b 73 20 6f 6e 20 6e 6f 64 65 20 69 4e  hecks on node iN
1edf0 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 61 74  ode, which is at
1ee00 20 64 65 70 74 68 20 69 44 65 70 74 68 20 77 69   depth iDepth wi
1ee10 74 68 69 6e 0a 2a 2a 20 74 68 65 20 72 2d 74 72  thin.** the r-tr
1ee20 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 41 72  ee structure. Ar
1ee30 67 75 6d 65 6e 74 20 61 50 61 72 65 6e 74 20 70  gument aParent p
1ee40 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 61 72 72  oints to the arr
1ee50 61 79 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74 65  ay of coordinate
1ee60 73 0a 2a 2a 20 74 68 61 74 20 62 6f 75 6e 64 20  s.** that bound 
1ee70 6e 6f 64 65 20 69 4e 6f 64 65 20 6f 6e 20 74 68  node iNode on th
1ee80 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 0a 2a  e parent node..*
1ee90 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 70 72 6f 62  *.** If any prob
1eea0 6c 65 6d 73 20 61 72 65 20 64 69 73 63 6f 76 65  lems are discove
1eeb0 72 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  red, an error me
1eec0 73 73 61 67 65 20 69 73 20 61 70 70 65 6e 64 65  ssage is appende
1eed0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 65 70 6f  d to the.** repo
1eee0 72 74 20 61 63 63 75 6d 75 6c 61 74 65 64 20 69  rt accumulated i
1eef0 6e 20 74 68 65 20 52 74 72 65 65 43 68 65 63 6b  n the RtreeCheck
1ef00 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
1ef10 69 63 20 76 6f 69 64 20 72 74 72 65 65 43 68 65  ic void rtreeChe
1ef20 63 6b 4e 6f 64 65 28 0a 20 20 52 74 72 65 65 43  ckNode(.  RtreeC
1ef30 68 65 63 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  heck *pCheck,.  
1ef40 69 6e 74 20 69 44 65 70 74 68 2c 20 20 20 20 20  int iDepth,     
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 2f 2a 20 44 65 70 74 68 20 6f 66 20 69 4e 6f 64  /* Depth of iNod
1ef70 65 20 28 30 3d 3d 6c 65 61 66 29 20 2a 2f 0a 20  e (0==leaf) */. 
1ef80 20 75 38 20 2a 61 50 61 72 65 6e 74 2c 20 20 20   u8 *aParent,   
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
1efb0 69 6e 69 6e 67 20 70 61 72 65 6e 74 20 63 6f 6f  ining parent coo
1efc0 72 64 73 20 2a 2f 0a 20 20 69 36 34 20 69 4e 6f  rds */.  i64 iNo
1efd0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
1efe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
1eff0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 29 7b 0a   to check */.){.
1f000 20 20 75 38 20 2a 61 4e 6f 64 65 20 3d 20 30 3b    u8 *aNode = 0;
1f010 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 20 3d 20 30  .  int nNode = 0
1f020 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4e 6f  ;..  assert( iNo
1f030 64 65 3d 3d 31 20 7c 7c 20 61 50 61 72 65 6e 74  de==1 || aParent
1f040 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1f050 20 70 43 68 65 63 6b 2d 3e 6e 44 69 6d 3e 30 20   pCheck->nDim>0 
1f060 29 3b 0a 0a 20 20 61 4e 6f 64 65 20 3d 20 72 74  );..  aNode = rt
1f070 72 65 65 43 68 65 63 6b 47 65 74 4e 6f 64 65 28  reeCheckGetNode(
1f080 70 43 68 65 63 6b 2c 20 69 4e 6f 64 65 2c 20 26  pCheck, iNode, &
1f090 6e 4e 6f 64 65 29 3b 0a 20 20 69 66 28 20 61 4e  nNode);.  if( aN
1f0a0 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ode ){.    if( n
1f0b0 4e 6f 64 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Node<4 ){.      
1f0c0 72 74 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64  rtreeCheckAppend
1f0d0 4d 73 67 28 70 43 68 65 63 6b 2c 20 0a 20 20 20  Msg(pCheck, .   
1f0e0 20 20 20 20 20 20 20 22 4e 6f 64 65 20 25 6c 6c         "Node %ll
1f0f0 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 28  d is too small (
1f100 25 64 20 62 79 74 65 73 29 22 2c 20 69 4e 6f 64  %d bytes)", iNod
1f110 65 2c 20 6e 4e 6f 64 65 0a 20 20 20 20 20 20 29  e, nNode.      )
1f120 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f130 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20     int nCell;   
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f150 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1f160 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  s on page */.   
1f170 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f190 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
1f1a0 65 20 74 68 72 6f 75 67 68 20 63 65 6c 6c 73 20  e through cells 
1f1b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 50 61  */.      if( aPa
1f1c0 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
1f1d0 20 20 20 69 44 65 70 74 68 20 3d 20 72 65 61 64     iDepth = read
1f1e0 49 6e 74 31 36 28 61 4e 6f 64 65 29 3b 0a 20 20  Int16(aNode);.  
1f1f0 20 20 20 20 20 20 69 66 28 20 69 44 65 70 74 68        if( iDepth
1f200 3e 52 54 52 45 45 5f 4d 41 58 5f 44 45 50 54 48  >RTREE_MAX_DEPTH
1f210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 74   ){.          rt
1f220 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73  reeCheckAppendMs
1f230 67 28 70 43 68 65 63 6b 2c 20 22 52 74 72 65 65  g(pCheck, "Rtree
1f240 20 64 65 70 74 68 20 6f 75 74 20 6f 66 20 72 61   depth out of ra
1f250 6e 67 65 20 28 25 64 29 22 2c 20 69 44 65 70 74  nge (%d)", iDept
1f260 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  h);.          sq
1f270 6c 69 74 65 33 5f 66 72 65 65 28 61 4e 6f 64 65  lite3_free(aNode
1f280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1f290 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
1f2b0 6c 6c 20 3d 20 72 65 61 64 49 6e 74 31 36 28 26  ll = readInt16(&
1f2c0 61 4e 6f 64 65 5b 32 5d 29 3b 0a 20 20 20 20 20  aNode[2]);.     
1f2d0 20 69 66 28 20 28 34 20 2b 20 6e 43 65 6c 6c 2a   if( (4 + nCell*
1f2e0 28 38 20 2b 20 70 43 68 65 63 6b 2d 3e 6e 44 69  (8 + pCheck->nDi
1f2f0 6d 2a 32 2a 34 29 29 3e 6e 4e 6f 64 65 20 29 7b  m*2*4))>nNode ){
1f300 0a 20 20 20 20 20 20 20 20 72 74 72 65 65 43 68  .        rtreeCh
1f310 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
1f320 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
1f330 20 20 22 4e 6f 64 65 20 25 6c 6c 64 20 69 73 20    "Node %lld is 
1f340 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 63 65  too small for ce
1f350 6c 6c 20 63 6f 75 6e 74 20 6f 66 20 25 64 20 28  ll count of %d (
1f360 25 64 20 62 79 74 65 73 29 22 2c 20 0a 20 20 20  %d bytes)", .   
1f370 20 20 20 20 20 20 20 20 20 69 4e 6f 64 65 2c 20           iNode, 
1f380 6e 43 65 6c 6c 2c 20 6e 4e 6f 64 65 0a 20 20 20  nCell, nNode.   
1f390 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
1f3a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
1f3b0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1f3c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
1f3d0 38 20 2a 70 43 65 6c 6c 20 3d 20 26 61 4e 6f 64  8 *pCell = &aNod
1f3e0 65 5b 34 20 2b 20 69 2a 28 38 20 2b 20 70 43 68  e[4 + i*(8 + pCh
1f3f0 65 63 6b 2d 3e 6e 44 69 6d 2a 32 2a 34 29 5d 3b  eck->nDim*2*4)];
1f400 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
1f410 56 61 6c 20 3d 20 72 65 61 64 49 6e 74 36 34 28  Val = readInt64(
1f420 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
1f430 20 20 72 74 72 65 65 43 68 65 63 6b 43 65 6c 6c    rtreeCheckCell
1f440 43 6f 6f 72 64 28 70 43 68 65 63 6b 2c 20 69 4e  Coord(pCheck, iN
1f450 6f 64 65 2c 20 69 2c 20 26 70 43 65 6c 6c 5b 38  ode, i, &pCell[8
1f460 5d 2c 20 61 50 61 72 65 6e 74 29 3b 0a 0a 20 20  ], aParent);..  
1f470 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65 70          if( iDep
1f480 74 68 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  th>0 ){.        
1f490 20 20 20 20 72 74 72 65 65 43 68 65 63 6b 4d 61      rtreeCheckMa
1f4a0 70 70 69 6e 67 28 70 43 68 65 63 6b 2c 20 30 2c  pping(pCheck, 0,
1f4b0 20 69 56 61 6c 2c 20 69 4e 6f 64 65 29 3b 0a 20   iVal, iNode);. 
1f4c0 20 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65             rtree
1f4d0 43 68 65 63 6b 4e 6f 64 65 28 70 43 68 65 63 6b  CheckNode(pCheck
1f4e0 2c 20 69 44 65 70 74 68 2d 31 2c 20 26 70 43 65  , iDepth-1, &pCe
1f4f0 6c 6c 5b 38 5d 2c 20 69 56 61 6c 29 3b 0a 20 20  ll[8], iVal);.  
1f500 20 20 20 20 20 20 20 20 20 20 70 43 68 65 63 6b            pCheck
1f510 2d 3e 6e 4e 6f 6e 4c 65 61 66 2b 2b 3b 0a 20 20  ->nNonLeaf++;.  
1f520 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f530 20 20 20 20 20 20 20 20 20 20 20 72 74 72 65 65             rtree
1f540 43 68 65 63 6b 4d 61 70 70 69 6e 67 28 70 43 68  CheckMapping(pCh
1f550 65 63 6b 2c 20 31 2c 20 69 56 61 6c 2c 20 69 4e  eck, 1, iVal, iN
1f560 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ode);.          
1f570 20 20 70 43 68 65 63 6b 2d 3e 6e 4c 65 61 66 2b    pCheck->nLeaf+
1f580 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
1f590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f5a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f5b0 65 33 5f 66 72 65 65 28 61 4e 6f 64 65 29 3b 0a  e3_free(aNode);.
1f5c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
1f5d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1f5e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f5f0 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
1f600 20 22 5f 72 6f 77 69 64 22 20 6f 72 0a 2a 2a 20   "_rowid" or.** 
1f610 22 5f 70 61 72 65 6e 74 22 2e 20 54 68 69 73 20  "_parent". This 
1f620 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1f630 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1f640 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
1f650 65 0a 2a 2a 20 25 5f 72 6f 77 69 64 20 6f 72 20  e.** %_rowid or 
1f660 25 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 20 69  %_parent table i
1f670 73 20 65 78 61 63 74 6c 79 20 6e 45 78 70 65 63  s exactly nExpec
1f680 74 2e 20 49 66 20 6e 6f 74 2c 20 69 74 20 61 64  t. If not, it ad
1f690 64 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  ds.** an error m
1f6a0 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 72 65  essage to the re
1f6b0 70 6f 72 74 20 69 6e 20 74 68 65 20 52 74 72 65  port in the Rtre
1f6c0 65 43 68 65 63 6b 20 6f 62 6a 65 63 74 20 69 6e  eCheck object in
1f6d0 64 69 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  dicated.** by th
1f6e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f6f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f700 20 72 74 72 65 65 43 68 65 63 6b 43 6f 75 6e 74   rtreeCheckCount
1f710 28 52 74 72 65 65 43 68 65 63 6b 20 2a 70 43 68  (RtreeCheck *pCh
1f720 65 63 6b 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eck, const char 
1f730 2a 7a 54 62 6c 2c 20 69 36 34 20 6e 45 78 70 65  *zTbl, i64 nExpe
1f740 63 74 29 7b 0a 20 20 69 66 28 20 70 43 68 65 63  ct){.  if( pChec
1f750 6b 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  k->rc==SQLITE_OK
1f760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f770 73 74 6d 74 20 2a 70 43 6f 75 6e 74 3b 0a 20 20  stmt *pCount;.  
1f780 20 20 70 43 6f 75 6e 74 20 3d 20 72 74 72 65 65    pCount = rtree
1f790 43 68 65 63 6b 50 72 65 70 61 72 65 28 70 43 68  CheckPrepare(pCh
1f7a0 65 63 6b 2c 20 22 53 45 4c 45 43 54 20 63 6f 75  eck, "SELECT cou
1f7b0 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27 25  nt(*) FROM %Q.'%
1f7c0 71 25 73 27 22 2c 0a 20 20 20 20 20 20 20 20 70  q%s'",.        p
1f7d0 43 68 65 63 6b 2d 3e 7a 44 62 2c 20 70 43 68 65  Check->zDb, pChe
1f7e0 63 6b 2d 3e 7a 54 61 62 2c 20 7a 54 62 6c 0a 20  ck->zTab, zTbl. 
1f7f0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43     );.    if( pC
1f800 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  ount ){.      if
1f810 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1f820 43 6f 75 6e 74 29 3d 3d 53 51 4c 49 54 45 5f 52  Count)==SQLITE_R
1f830 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  OW ){.        i6
1f840 34 20 6e 41 63 74 75 61 6c 20 3d 20 73 71 6c 69  4 nActual = sqli
1f850 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1f860 28 70 43 6f 75 6e 74 2c 20 30 29 3b 0a 20 20 20  (pCount, 0);.   
1f870 20 20 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c       if( nActual
1f880 21 3d 6e 45 78 70 65 63 74 20 29 7b 0a 20 20 20  !=nExpect ){.   
1f890 20 20 20 20 20 20 20 72 74 72 65 65 43 68 65 63         rtreeChec
1f8a0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
1f8b0 6b 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72  k, "Wrong number
1f8c0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 25   of entries in %
1f8d0 25 25 73 20 74 61 62 6c 65 22 0a 20 20 20 20 20  %%s table".     
1f8e0 20 20 20 20 20 20 20 20 20 22 20 2d 20 65 78 70           " - exp
1f8f0 65 63 74 65 64 20 25 6c 6c 64 2c 20 61 63 74 75  ected %lld, actu
1f900 61 6c 20 25 6c 6c 64 22 20 2c 20 7a 54 62 6c 2c  al %lld" , zTbl,
1f910 20 6e 45 78 70 65 63 74 2c 20 6e 41 63 74 75 61   nExpect, nActua
1f920 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  l.          );. 
1f930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f940 0a 20 20 20 20 20 20 70 43 68 65 63 6b 2d 3e 72  .      pCheck->r
1f950 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
1f960 6c 69 7a 65 28 70 43 6f 75 6e 74 29 3b 0a 20 20  lize(pCount);.  
1f970 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f980 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1f990 6f 65 73 20 74 68 65 20 62 75 6c 6b 20 6f 66 20  oes the bulk of 
1f9a0 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74 68 65  the work for the
1f9b0 20 72 74 72 65 65 20 69 6e 74 65 67 72 69 74 79   rtree integrity
1f9c0 2d 63 68 65 63 6b 2e 0a 2a 2a 20 49 74 20 69 73  -check..** It is
1f9d0 20 63 61 6c 6c 65 64 20 62 79 20 72 74 72 65 65   called by rtree
1f9e0 63 68 65 63 6b 28 29 2c 20 77 68 69 63 68 20 69  check(), which i
1f9f0 73 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  s the SQL functi
1fa00 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  on implementatio
1fa10 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1fa20 20 72 74 72 65 65 43 68 65 63 6b 54 61 62 6c 65   rtreeCheckTable
1fa30 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fa60 68 61 6e 64 6c 65 20 74 6f 20 61 63 63 65 73 73  handle to access
1fa70 20 64 62 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20   db through */. 
1fa80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1fa90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1faa0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 62 20 28   /* Name of db (
1fab0 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
1fac0 74 63 2e 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tc.) */.  const 
1fad0 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20 20  char *zTab,     
1fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1faf0 65 20 6f 66 20 72 74 72 65 65 20 74 61 62 6c 65  e of rtree table
1fb00 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63   to check */.  c
1fb10 68 61 72 20 2a 2a 70 7a 52 65 70 6f 72 74 20 20  har **pzReport  
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb30 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d  * OUT: sqlite3_m
1fb40 61 6c 6c 6f 63 27 64 20 72 65 70 6f 72 74 20 74  alloc'd report t
1fb50 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65  ext */.){.  Rtre
1fb60 65 43 68 65 63 6b 20 63 68 65 63 6b 3b 20 20 20  eCheck check;   
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1fb80 6f 6d 6d 6f 6e 20 63 6f 6e 74 65 78 74 20 66 6f  ommon context fo
1fb90 72 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  r various routin
1fba0 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
1fbb0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1fbc0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1fbd0 74 6f 20 66 69 6e 64 20 63 6f 6c 75 6d 6e 20 63  to find column c
1fbe0 6f 75 6e 74 20 6f 66 20 72 74 72 65 65 20 74 61  ount of rtree ta
1fbf0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e  ble */.  int bEn
1fc00 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1fc10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fc20 20 69 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   if transaction 
1fc30 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
1fc40 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 78 20 3d   */.  int nAux =
1fc50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fc60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fc70 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  of extra columns
1fc80 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  . */..  /* Initi
1fc90 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 78  alize the contex
1fca0 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6d 65  t object */.  me
1fcb0 6d 73 65 74 28 26 63 68 65 63 6b 2c 20 30 2c 20  mset(&check, 0, 
1fcc0 73 69 7a 65 6f 66 28 63 68 65 63 6b 29 29 3b 0a  sizeof(check));.
1fcd0 20 20 63 68 65 63 6b 2e 64 62 20 3d 20 64 62 3b    check.db = db;
1fce0 0a 20 20 63 68 65 63 6b 2e 7a 44 62 20 3d 20 7a  .  check.zDb = z
1fcf0 44 62 3b 0a 20 20 63 68 65 63 6b 2e 7a 54 61 62  Db;.  check.zTab
1fd00 20 3d 20 7a 54 61 62 3b 0a 0a 20 20 2f 2a 20 49   = zTab;..  /* I
1fd10 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  f there is not a
1fd20 6c 72 65 61 64 79 20 61 6e 20 6f 70 65 6e 20 74  lready an open t
1fd30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 70 65 6e  ransaction, open
1fd40 20 6f 6e 65 20 6e 6f 77 2e 20 54 68 69 73 20 69   one now. This i
1fd50 73 0a 20 20 2a 2a 20 74 6f 20 65 6e 73 75 72 65  s.  ** to ensure
1fd60 20 74 68 61 74 20 74 68 65 20 71 75 65 72 69 65   that the querie
1fd70 73 20 72 75 6e 20 61 73 20 70 61 72 74 20 6f 66  s run as part of
1fd80 20 74 68 69 73 20 69 6e 74 65 67 72 69 74 79 2d   this integrity-
1fd90 63 68 65 63 6b 20 6f 70 65 72 61 74 65 0a 20 20  check operate.  
1fda0 2a 2a 20 6f 6e 20 61 20 63 6f 6e 73 69 73 74 65  ** on a consiste
1fdb0 6e 74 20 73 6e 61 70 73 68 6f 74 2e 20 20 2a 2f  nt snapshot.  */
1fdc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 67  .  if( sqlite3_g
1fdd0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62  et_autocommit(db
1fde0 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 2e 72  ) ){.    check.r
1fdf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1fe00 28 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  (db, "BEGIN", 0,
1fe10 20 30 2c 20 30 29 3b 0a 20 20 20 20 62 45 6e 64   0, 0);.    bEnd
1fe20 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1fe30 46 69 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  Find the number 
1fe40 6f 66 20 61 75 78 69 6c 69 61 72 79 20 63 6f 6c  of auxiliary col
1fe50 75 6d 6e 73 20 2a 2f 0a 20 20 69 66 28 20 63 68  umns */.  if( ch
1fe60 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  eck.rc==SQLITE_O
1fe70 4b 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d  K ){.    pStmt =
1fe80 20 72 74 72 65 65 43 68 65 63 6b 50 72 65 70 61   rtreeCheckPrepa
1fe90 72 65 28 26 63 68 65 63 6b 2c 20 22 53 45 4c 45  re(&check, "SELE
1fea0 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e 27 25 71  CT * FROM %Q.'%q
1feb0 5f 72 6f 77 69 64 27 22 2c 20 7a 44 62 2c 20 7a  _rowid'", zDb, z
1fec0 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53  Tab);.    if( pS
1fed0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 75  tmt ){.      nAu
1fee0 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
1fef0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 20  mn_count(pStmt) 
1ff00 2d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  - 2;.      sqlit
1ff10 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1ff20 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 68  t);.    }.    ch
1ff30 65 63 6b 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f  eck.rc = SQLITE_
1ff40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
1ff50 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 6d  nd number of dim
1ff60 65 6e 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  ensions in the r
1ff70 74 72 65 65 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tree table. */. 
1ff80 20 70 53 74 6d 74 20 3d 20 72 74 72 65 65 43 68   pStmt = rtreeCh
1ff90 65 63 6b 50 72 65 70 61 72 65 28 26 63 68 65 63  eckPrepare(&chec
1ffa0 6b 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  k, "SELECT * FRO
1ffb0 4d 20 25 51 2e 25 51 22 2c 20 7a 44 62 2c 20 7a  M %Q.%Q", zDb, z
1ffc0 54 61 62 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  Tab);.  if( pStm
1ffd0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
1ffe0 0a 20 20 20 20 63 68 65 63 6b 2e 6e 44 69 6d 20  .    check.nDim 
1fff0 3d 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  = (sqlite3_colum
20000 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 20 2d  n_count(pStmt) -
20010 20 31 20 2d 20 6e 41 75 78 29 20 2f 20 32 3b 0a   1 - nAux) / 2;.
20020 20 20 20 20 69 66 28 20 63 68 65 63 6b 2e 6e 44      if( check.nD
20030 69 6d 3c 31 20 29 7b 0a 20 20 20 20 20 20 72 74  im<1 ){.      rt
20040 72 65 65 43 68 65 63 6b 41 70 70 65 6e 64 4d 73  reeCheckAppendMs
20050 67 28 26 63 68 65 63 6b 2c 20 22 53 63 68 65 6d  g(&check, "Schem
20060 61 20 63 6f 72 72 75 70 74 20 6f 72 20 6e 6f 74  a corrupt or not
20070 20 61 6e 20 72 74 72 65 65 22 29 3b 0a 20 20 20   an rtree");.   
20080 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
20090 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
200a0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
200b0 20 20 20 20 63 68 65 63 6b 2e 62 49 6e 74 20 3d      check.bInt =
200c0 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   (sqlite3_column
200d0 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 31 29 3d  _type(pStmt, 1)=
200e0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29  =SQLITE_INTEGER)
200f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
20100 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20110 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
20120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc!=SQLITE_COR
20130 52 55 50 54 20 29 20 63 68 65 63 6b 2e 72 63 20  RUPT ) check.rc 
20140 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = rc;.  }..  /* 
20150 44 6f 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e  Do the actual in
20160 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f  tegrity-check */
20170 0a 20 20 69 66 28 20 63 68 65 63 6b 2e 6e 44 69  .  if( check.nDi
20180 6d 3e 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  m>=1 ){.    if( 
20190 63 68 65 63 6b 2e 72 63 3d 3d 53 51 4c 49 54 45  check.rc==SQLITE
201a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 74 72  _OK ){.      rtr
201b0 65 65 43 68 65 63 6b 4e 6f 64 65 28 26 63 68 65  eeCheckNode(&che
201c0 63 6b 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  ck, 0, 0, 1);.  
201d0 20 20 7d 0a 20 20 20 20 72 74 72 65 65 43 68 65    }.    rtreeChe
201e0 63 6b 43 6f 75 6e 74 28 26 63 68 65 63 6b 2c 20  ckCount(&check, 
201f0 22 5f 72 6f 77 69 64 22 2c 20 63 68 65 63 6b 2e  "_rowid", check.
20200 6e 4c 65 61 66 29 3b 0a 20 20 20 20 72 74 72 65  nLeaf);.    rtre
20210 65 43 68 65 63 6b 43 6f 75 6e 74 28 26 63 68 65  eCheckCount(&che
20220 63 6b 2c 20 22 5f 70 61 72 65 6e 74 22 2c 20 63  ck, "_parent", c
20230 68 65 63 6b 2e 6e 4e 6f 6e 4c 65 61 66 29 3b 0a  heck.nNonLeaf);.
20240 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 69    }..  /* Finali
20250 7a 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ze SQL statement
20260 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  s used by the in
20270 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 2a 2f  tegrity-check */
20280 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
20290 69 7a 65 28 63 68 65 63 6b 2e 70 47 65 74 4e 6f  ize(check.pGetNo
202a0 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
202b0 69 6e 61 6c 69 7a 65 28 63 68 65 63 6b 2e 61 43  inalize(check.aC
202c0 68 65 63 6b 4d 61 70 70 69 6e 67 5b 30 5d 29 3b  heckMapping[0]);
202d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
202e0 69 7a 65 28 63 68 65 63 6b 2e 61 43 68 65 63 6b  ize(check.aCheck
202f0 4d 61 70 70 69 6e 67 5b 31 5d 29 3b 0a 0a 20 20  Mapping[1]);..  
20300 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73 20 6f 70  /* If one was op
20310 65 6e 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  ened, close the 
20320 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
20330 20 69 66 28 20 62 45 6e 64 20 29 7b 0a 20 20 20   if( bEnd ){.   
20340 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20350 33 5f 65 78 65 63 28 64 62 2c 20 22 45 4e 44 22  3_exec(db, "END"
20360 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
20370 69 66 28 20 63 68 65 63 6b 2e 72 63 3d 3d 53 51  if( check.rc==SQ
20380 4c 49 54 45 5f 4f 4b 20 29 20 63 68 65 63 6b 2e  LITE_OK ) check.
20390 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  rc = rc;.  }.  *
203a0 70 7a 52 65 70 6f 72 74 20 3d 20 63 68 65 63 6b  pzReport = check
203b0 2e 7a 52 65 70 6f 72 74 3b 0a 20 20 72 65 74 75  .zReport;.  retu
203c0 72 6e 20 63 68 65 63 6b 2e 72 63 3b 0a 7d 0a 0a  rn check.rc;.}..
203d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
203e0 2a 2a 20 20 20 72 74 72 65 65 63 68 65 63 6b 28  **   rtreecheck(
203f0 3c 72 74 72 65 65 2d 74 61 62 6c 65 3e 29 3b 0a  <rtree-table>);.
20400 2a 2a 20 20 20 72 74 72 65 65 63 68 65 63 6b 28  **   rtreecheck(
20410 3c 64 61 74 61 62 61 73 65 3e 2c 20 3c 72 74 72  <database>, <rtr
20420 65 65 2d 74 61 62 6c 65 3e 29 3b 0a 2a 2a 0a 2a  ee-table>);.**.*
20430 2a 20 49 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  * Invoking this 
20440 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  SQL function run
20450 73 20 61 6e 20 69 6e 74 65 67 72 69 74 79 2d 63  s an integrity-c
20460 68 65 63 6b 20 6f 6e 20 74 68 65 20 6e 61 6d 65  heck on the name
20470 64 20 72 74 72 65 65 0a 2a 2a 20 74 61 62 6c 65  d rtree.** table
20480 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 2d  . The integrity-
20490 63 68 65 63 6b 20 76 65 72 69 66 69 65 73 20 74  check verifies t
204a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
204b0 0a 2a 2a 20 20 20 31 2e 20 46 6f 72 20 65 61 63  .**   1. For eac
204c0 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 2d  h cell in the r-
204d0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 28  tree structure (
204e0 25 5f 6e 6f 64 65 20 74 61 62 6c 65 29 2c 20 74  %_node table), t
204f0 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  hat:.**.**      
20500 20 61 29 20 66 6f 72 20 65 61 63 68 20 64 69 6d   a) for each dim
20510 65 6e 73 69 6f 6e 2c 20 28 63 6f 6f 72 64 31 20  ension, (coord1 
20520 3c 3d 20 63 6f 6f 72 64 32 29 2e 0a 2a 2a 0a 2a  <= coord2)..**.*
20530 2a 20 20 20 20 20 20 20 62 29 20 75 6e 6c 65 73  *       b) unles
20540 73 20 74 68 65 20 63 65 6c 6c 20 69 73 20 6f 6e  s the cell is on
20550 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 20   the root node, 
20560 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 69 73  that the cell is
20570 20 62 6f 75 6e 64 65 64 0a 2a 2a 20 20 20 20 20   bounded.**     
20580 20 20 20 20 20 62 79 20 74 68 65 20 70 61 72 65       by the pare
20590 6e 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  nt cell on the p
205a0 61 72 65 6e 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  arent node..**.*
205b0 2a 20 20 20 20 20 20 20 63 29 20 66 6f 72 20 6c  *       c) for l
205c0 65 61 66 20 6e 6f 64 65 73 2c 20 74 68 61 74 20  eaf nodes, that 
205d0 74 68 65 72 65 20 69 73 20 61 6e 20 65 6e 74 72  there is an entr
205e0 79 20 69 6e 20 74 68 65 20 25 5f 72 6f 77 69 64  y in the %_rowid
205f0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 61   .**          ta
20600 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ble correspondin
20610 67 20 74 6f 20 74 68 65 20 63 65 6c 6c 27 73 20  g to the cell's 
20620 72 6f 77 69 64 20 76 61 6c 75 65 20 74 68 61 74  rowid value that
20630 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 6f   .**          po
20640 69 6e 74 73 20 74 6f 20 74 68 65 20 63 6f 72 72  ints to the corr
20650 65 63 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ect node..**.** 
20660 20 20 20 20 20 20 64 29 20 66 6f 72 20 63 65 6c        d) for cel
20670 6c 73 20 6f 6e 20 6e 6f 6e 2d 6c 65 61 66 20 6e  ls on non-leaf n
20680 6f 64 65 73 2c 20 74 68 61 74 20 74 68 65 72 65  odes, that there
20690 20 69 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20   is an entry in 
206a0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  the .**         
206b0 20 25 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 20   %_parent table 
206c0 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
206d0 20 63 65 6c 6c 27 73 20 63 68 69 6c 64 20 6e 6f   cell's child no
206e0 64 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  de to the.**    
206f0 20 20 20 20 20 20 6e 6f 64 65 20 74 68 61 74 20        node that 
20700 69 74 20 72 65 73 69 64 65 73 20 6f 6e 2e 0a 2a  it resides on..*
20710 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 61 74 20 74  *.**   2. That t
20720 68 65 72 65 20 61 72 65 20 74 68 65 20 73 61 6d  here are the sam
20730 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
20740 69 65 73 20 69 6e 20 74 68 65 20 25 5f 72 6f 77  ies in the %_row
20750 69 64 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  id table.**     
20760 20 61 73 20 74 68 65 72 65 20 61 72 65 20 6c 65   as there are le
20770 61 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  af cells in the 
20780 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
20790 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 72 65  , and that there
207a0 0a 2a 2a 20 20 20 20 20 20 69 73 20 61 20 6c 65  .**      is a le
207b0 61 66 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 72  af cell that cor
207c0 72 65 73 70 6f 6e 64 73 20 74 6f 20 65 61 63 68  responds to each
207d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f   entry in the %_
207e0 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rowid table..**.
207f0 2a 2a 20 20 20 33 2e 20 54 68 61 74 20 74 68 65  **   3. That the
20800 72 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  re are the same 
20810 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
20820 73 20 69 6e 20 74 68 65 20 25 5f 70 61 72 65 6e  s in the %_paren
20830 74 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  t table.**      
20840 61 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 6e  as there are non
20850 2d 6c 65 61 66 20 63 65 6c 6c 73 20 69 6e 20 74  -leaf cells in t
20860 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74  he r-tree struct
20870 75 72 65 2c 20 61 6e 64 20 74 68 61 74 20 0a 2a  ure, and that .*
20880 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
20890 61 20 6e 6f 6e 2d 6c 65 61 66 20 63 65 6c 6c 20  a non-leaf cell 
208a0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
208b0 20 74 6f 20 65 61 63 68 20 65 6e 74 72 79 20 69   to each entry i
208c0 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 25  n the .**      %
208d0 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 2a  _parent table..*
208e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 74  /.static void rt
208f0 72 65 65 63 68 65 63 6b 28 0a 20 20 73 71 6c 69  reecheck(.  sqli
20900 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
20910 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a  , .  int nArg, .
20920 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
20930 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 69 66 28  **apArg.){.  if(
20940 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41 72 67   nArg!=1 && nArg
20950 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=2 ){.    sqlit
20960 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
20970 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77  ctx, .        "w
20980 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
20990 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
209a0 74 69 6f 6e 20 72 74 72 65 65 63 68 65 63 6b 28  tion rtreecheck(
209b0 29 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20  )", -1.    );.  
209c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
209d0 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65  c;.    char *zRe
209e0 70 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f  port = 0;.    co
209f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
20a00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
20a10 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
20a20 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 63  apArg[0]);.    c
20a30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b  onst char *zTab;
20a40 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
20a50 20 29 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d   ){.      zTab =
20a60 20 7a 44 62 3b 0a 20 20 20 20 20 20 7a 44 62 20   zDb;.      zDb 
20a70 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65  = "main";.    }e
20a80 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
20a90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
20aa0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
20ab0 74 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20 20 20  t(apArg[1]);.   
20ac0 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65   }.    rc = rtre
20ad0 65 43 68 65 63 6b 54 61 62 6c 65 28 73 71 6c 69  eCheckTable(sqli
20ae0 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
20af0 61 6e 64 6c 65 28 63 74 78 29 2c 20 7a 44 62 2c  andle(ctx), zDb,
20b00 20 7a 54 61 62 2c 20 26 7a 52 65 70 6f 72 74 29   zTab, &zReport)
20b10 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20b30 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
20b40 74 65 78 74 28 63 74 78 2c 20 7a 52 65 70 6f 72  text(ctx, zRepor
20b50 74 20 3f 20 7a 52 65 70 6f 72 74 20 3a 20 22 6f  t ? zReport : "o
20b60 6b 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  k", -1, SQLITE_T
20b70 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
20b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
20b90 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
20ba0 5f 63 6f 64 65 28 63 74 78 2c 20 72 63 29 3b 0a  _code(ctx, rc);.
20bb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20bc0 33 5f 66 72 65 65 28 7a 52 65 70 6f 72 74 29 3b  3_free(zReport);
20bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6e 64 69  .  }.}../* Condi
20be0 74 69 6f 6e 61 6c 6c 79 20 69 6e 63 6c 75 64 65  tionally include
20bf0 20 74 68 65 20 67 65 6f 70 6f 6c 79 20 63 6f 64   the geopoly cod
20c00 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
20c10 54 45 5f 45 4e 41 42 4c 45 5f 47 45 4f 50 4f 4c  TE_ENABLE_GEOPOL
20c20 59 0a 23 20 69 6e 63 6c 75 64 65 20 22 67 65 6f  Y.# include "geo
20c30 70 6f 6c 79 2e 63 22 0a 23 65 6e 64 69 66 0a 0a  poly.c".#endif..
20c40 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
20c50 68 65 20 72 2d 74 72 65 65 20 6d 6f 64 75 6c 65  he r-tree module
20c60 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68   with database h
20c70 61 6e 64 6c 65 20 64 62 2e 20 54 68 69 73 20 63  andle db. This c
20c80 72 65 61 74 65 73 20 74 68 65 0a 2a 2a 20 76 69  reates the.** vi
20c90 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
20ca0 6c 65 20 22 72 74 72 65 65 22 20 61 6e 64 20 74  le "rtree" and t
20cb0 68 65 20 64 65 62 75 67 67 69 6e 67 2f 61 6e 61  he debugging/ana
20cc0 6c 79 73 69 73 20 73 63 61 6c 61 72 20 0a 2a 2a  lysis scalar .**
20cd0 20 66 75 6e 63 74 69 6f 6e 20 22 72 74 72 65 65   function "rtree
20ce0 6e 6f 64 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  node"..*/.int sq
20cf0 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 73  lite3RtreeInit(s
20d00 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
20d10 6f 6e 73 74 20 69 6e 74 20 75 74 66 38 20 3d 20  onst int utf8 = 
20d20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 69  SQLITE_UTF8;.  i
20d30 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
20d40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20d50 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72 74 72 65  nction(db, "rtre
20d60 65 6e 6f 64 65 22 2c 20 32 2c 20 75 74 66 38 2c  enode", 2, utf8,
20d70 20 30 2c 20 72 74 72 65 65 6e 6f 64 65 2c 20 30   0, rtreenode, 0
20d80 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
20d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
20db0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
20dc0 2c 20 22 72 74 72 65 65 64 65 70 74 68 22 2c 20  , "rtreedepth", 
20dd0 31 2c 20 75 74 66 38 2c 20 30 2c 72 74 72 65 65  1, utf8, 0,rtree
20de0 64 65 70 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20  depth, 0, 0);.  
20df0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
20e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
20e10 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
20e20 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72  _function(db, "r
20e30 74 72 65 65 63 68 65 63 6b 22 2c 20 2d 31 2c 20  treecheck", -1, 
20e40 75 74 66 38 2c 20 30 2c 72 74 72 65 65 63 68 65  utf8, 0,rtreeche
20e50 63 6b 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 20 20  ck, 0,0);.  }.  
20e60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20e70 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  K ){.#ifdef SQLI
20e80 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c  TE_RTREE_INT_ONL
20e90 59 0a 20 20 20 20 76 6f 69 64 20 2a 63 20 3d 20  Y.    void *c = 
20ea0 28 76 6f 69 64 20 2a 29 52 54 52 45 45 5f 43 4f  (void *)RTREE_CO
20eb0 4f 52 44 5f 49 4e 54 33 32 3b 0a 23 65 6c 73 65  ORD_INT32;.#else
20ec0 0a 20 20 20 20 76 6f 69 64 20 2a 63 20 3d 20 28  .    void *c = (
20ed0 76 6f 69 64 20 2a 29 52 54 52 45 45 5f 43 4f 4f  void *)RTREE_COO
20ee0 52 44 5f 52 45 41 4c 33 32 3b 0a 23 65 6e 64 69  RD_REAL32;.#endi
20ef0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
20f00 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
20f10 5f 76 32 28 64 62 2c 20 22 72 74 72 65 65 22 2c  _v2(db, "rtree",
20f20 20 26 72 74 72 65 65 4d 6f 64 75 6c 65 2c 20 63   &rtreeModule, c
20f30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
20f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20f50 0a 20 20 20 20 76 6f 69 64 20 2a 63 20 3d 20 28  .    void *c = (
20f60 76 6f 69 64 20 2a 29 52 54 52 45 45 5f 43 4f 4f  void *)RTREE_COO
20f70 52 44 5f 49 4e 54 33 32 3b 0a 20 20 20 20 72 63  RD_INT32;.    rc
20f80 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
20f90 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20  e_module_v2(db, 
20fa0 22 72 74 72 65 65 5f 69 33 32 22 2c 20 26 72 74  "rtree_i32", &rt
20fb0 72 65 65 4d 6f 64 75 6c 65 2c 20 63 2c 20 30 29  reeModule, c, 0)
20fc0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
20fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 47 45 4f 50 4f  ITE_ENABLE_GEOPO
20fe0 4c 59 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  LY.  if( rc==SQL
20ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21000 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 6f 70 6f   = sqlite3_geopo
21010 6c 79 5f 69 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ly_init(db);.  }
21020 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
21030 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21040 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 6c 65  his routine dele
21050 74 65 73 20 74 68 65 20 52 74 72 65 65 47 65 6f  tes the RtreeGeo
21060 6d 43 61 6c 6c 62 61 63 6b 20 6f 62 6a 65 63 74  mCallback object
21070 20 74 68 61 74 20 77 61 73 20 61 74 74 61 63 68   that was attach
21080 65 64 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ed.** one of the
21090 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
210a0 72 65 61 74 65 20 62 79 20 73 71 6c 69 74 65 33  reate by sqlite3
210b0 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f  _rtree_geometry_
210c0 63 61 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72  callback().** or
210d0 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71   sqlite3_rtree_q
210e0 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 29 2e  uery_callback().
210f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
21100 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
21110 73 20 74 68 65 0a 2a 2a 20 64 65 73 74 72 75 63  s the.** destruc
21120 74 6f 72 20 66 6f 72 20 61 6e 20 52 74 72 65 65  tor for an Rtree
21130 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 6f 62 6a  GeomCallback obj
21140 65 63 63 74 2e 20 20 54 68 69 73 20 72 6f 75 74  ecct.  This rout
21150 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
21160 65 6e 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  en.** the corres
21170 70 6f 6e 64 69 6e 67 20 53 51 4c 20 66 75 6e 63  ponding SQL func
21180 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 2e  tion is deleted.
21190 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
211a0 72 74 72 65 65 46 72 65 65 43 61 6c 6c 62 61 63  rtreeFreeCallbac
211b0 6b 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 52 74  k(void *p){.  Rt
211c0 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
211d0 2a 70 49 6e 66 6f 20 3d 20 28 52 74 72 65 65 47  *pInfo = (RtreeG
211e0 65 6f 6d 43 61 6c 6c 62 61 63 6b 2a 29 70 3b 0a  eomCallback*)p;.
211f0 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 78 44 65    if( pInfo->xDe
21200 73 74 72 75 63 74 6f 72 20 29 20 70 49 6e 66 6f  structor ) pInfo
21210 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 49  ->xDestructor(pI
21220 6e 66 6f 2d 3e 70 43 6f 6e 74 65 78 74 29 3b 0a  nfo->pContext);.
21230 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21240 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
21250 20 72 6f 75 74 69 6e 65 20 66 72 65 65 73 20 74   routine frees t
21260 68 65 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20  he BLOB that is 
21270 72 65 74 75 72 6e 65 64 20 62 79 20 67 65 6f 6d  returned by geom
21280 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2f 0a 73  Callback()..*/.s
21290 74 61 74 69 63 20 76 6f 69 64 20 72 74 72 65 65  tatic void rtree
212a0 4d 61 74 63 68 41 72 67 46 72 65 65 28 76 6f 69  MatchArgFree(voi
212b0 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
212c0 69 3b 0a 20 20 52 74 72 65 65 4d 61 74 63 68 41  i;.  RtreeMatchA
212d0 72 67 20 2a 70 20 3d 20 28 52 74 72 65 65 4d 61  rg *p = (RtreeMa
212e0 74 63 68 41 72 67 2a 29 70 41 72 67 3b 0a 20 20  tchArg*)pArg;.  
212f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 50  for(i=0; i<p->nP
21300 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aram; i++){.    
21310 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
21320 65 65 28 70 2d 3e 61 70 53 71 6c 50 61 72 61 6d  ee(p->apSqlParam
21330 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
21340 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
21350 2f 2a 0a 2a 2a 20 45 61 63 68 20 63 61 6c 6c 20  /*.** Each call 
21360 74 6f 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65  to sqlite3_rtree
21370 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61  _geometry_callba
21380 63 6b 28 29 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  ck() or.** sqlit
21390 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 63  e3_rtree_query_c
213a0 61 6c 6c 62 61 63 6b 28 29 20 63 72 65 61 74 65  allback() create
213b0 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 53 51  s an ordinary SQ
213c0 4c 69 74 65 0a 2a 2a 20 73 63 61 6c 61 72 20 66  Lite.** scalar f
213d0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
213e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74  implemented by t
213f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
21400 2a 2a 20 41 6c 6c 20 74 68 69 73 20 66 75 6e 63  ** All this func
21410 74 69 6f 6e 20 64 6f 65 73 20 69 73 20 63 6f 6e  tion does is con
21420 73 74 72 75 63 74 20 61 6e 20 52 74 72 65 65 4d  struct an RtreeM
21430 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74 20 74  atchArg object t
21440 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  hat.** contains 
21450 74 68 65 20 67 65 6f 6d 65 74 72 79 2d 63 68 65  the geometry-che
21460 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 20 72  cking callback r
21470 6f 75 74 69 6e 65 73 20 61 6e 64 20 61 20 6c 69  outines and a li
21480 73 74 20 6f 66 0a 2a 2a 20 70 61 72 61 6d 65 74  st of.** paramet
21490 65 72 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ers to this func
214a0 74 69 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72  tion, then retur
214b0 6e 20 74 68 61 74 20 52 74 72 65 65 4d 61 74 63  n that RtreeMatc
214c0 68 41 72 67 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  hArg object.** a
214d0 73 20 61 20 42 4c 4f 42 2e 0a 2a 2a 0a 2a 2a 20  s a BLOB..**.** 
214e0 54 68 65 20 52 2d 54 72 65 65 20 4d 41 54 43 48  The R-Tree MATCH
214f0 20 6f 70 65 72 61 74 6f 72 20 77 69 6c 6c 20 72   operator will r
21500 65 61 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  ead the returned
21510 20 42 4c 4f 42 2c 20 64 65 73 65 72 69 61 6c 69   BLOB, deseriali
21520 7a 65 0a 2a 2a 20 74 68 65 20 52 74 72 65 65 4d  ze.** the RtreeM
21530 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74 2c 20  atchArg object, 
21540 61 6e 64 20 75 73 65 20 74 68 65 20 52 74 72 65  and use the Rtre
21550 65 4d 61 74 63 68 41 72 67 20 6f 62 6a 65 63 74  eMatchArg object
21560 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a 20 6f 75   to figure.** ou
21570 74 20 77 68 69 63 68 20 65 6c 65 6d 65 6e 74 73  t which elements
21580 20 6f 66 20 74 68 65 20 52 2d 54 72 65 65 20 73   of the R-Tree s
21590 68 6f 75 6c 64 20 62 65 20 72 65 74 75 72 6e 65  hould be returne
215a0 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
215b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
215c0 65 6f 6d 43 61 6c 6c 62 61 63 6b 28 73 71 6c 69  eomCallback(sqli
215d0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
215e0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69  , int nArg, sqli
215f0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67  te3_value **aArg
21600 29 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61  ){.  RtreeGeomCa
21610 6c 6c 62 61 63 6b 20 2a 70 47 65 6f 6d 43 74 78  llback *pGeomCtx
21620 20 3d 20 28 52 74 72 65 65 47 65 6f 6d 43 61 6c   = (RtreeGeomCal
21630 6c 62 61 63 6b 20 2a 29 73 71 6c 69 74 65 33 5f  lback *)sqlite3_
21640 75 73 65 72 5f 64 61 74 61 28 63 74 78 29 3b 0a  user_data(ctx);.
21650 20 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20    RtreeMatchArg 
21660 2a 70 42 6c 6f 62 3b 0a 20 20 73 71 6c 69 74 65  *pBlob;.  sqlite
21670 33 5f 69 6e 74 36 34 20 6e 42 6c 6f 62 3b 0a 20  3_int64 nBlob;. 
21680 20 69 6e 74 20 6d 65 6d 45 72 72 20 3d 20 30 3b   int memErr = 0;
21690 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 69 7a 65  ..  nBlob = size
216a0 6f 66 28 52 74 72 65 65 4d 61 74 63 68 41 72 67  of(RtreeMatchArg
216b0 29 20 2b 20 28 6e 41 72 67 2d 31 29 2a 73 69 7a  ) + (nArg-1)*siz
216c0 65 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29  eof(RtreeDValue)
216d0 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e 41  .           + nA
216e0 72 67 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  rg*sizeof(sqlite
216f0 33 5f 76 61 6c 75 65 2a 29 3b 0a 20 20 70 42 6c  3_value*);.  pBl
21700 6f 62 20 3d 20 28 52 74 72 65 65 4d 61 74 63 68  ob = (RtreeMatch
21710 41 72 67 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Arg *)sqlite3_ma
21720 6c 6c 6f 63 36 34 28 6e 42 6c 6f 62 29 3b 0a 20  lloc64(nBlob);. 
21730 20 69 66 28 20 21 70 42 6c 6f 62 20 29 7b 0a 20   if( !pBlob ){. 
21740 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
21750 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74  t_error_nomem(ct
21760 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
21770 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 42 6c 6f   int i;.    pBlo
21780 62 2d 3e 69 53 69 7a 65 20 3d 20 6e 42 6c 6f 62  b->iSize = nBlob
21790 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 63 62 20  ;.    pBlob->cb 
217a0 3d 20 70 47 65 6f 6d 43 74 78 5b 30 5d 3b 0a 20  = pGeomCtx[0];. 
217b0 20 20 20 70 42 6c 6f 62 2d 3e 61 70 53 71 6c 50     pBlob->apSqlP
217c0 61 72 61 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f  aram = (sqlite3_
217d0 76 61 6c 75 65 2a 2a 29 26 70 42 6c 6f 62 2d 3e  value**)&pBlob->
217e0 61 50 61 72 61 6d 5b 6e 41 72 67 5d 3b 0a 20 20  aParam[nArg];.  
217f0 20 20 70 42 6c 6f 62 2d 3e 6e 50 61 72 61 6d 20    pBlob->nParam 
21800 3d 20 6e 41 72 67 3b 0a 20 20 20 20 66 6f 72 28  = nArg;.    for(
21810 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
21820 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e  ){.      pBlob->
21830 61 70 53 71 6c 50 61 72 61 6d 5b 69 5d 20 3d 20  apSqlParam[i] = 
21840 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 75  sqlite3_value_du
21850 70 28 61 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  p(aArg[i]);.    
21860 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 61 70 53    if( pBlob->apS
21870 71 6c 50 61 72 61 6d 5b 69 5d 3d 3d 30 20 29 20  qlParam[i]==0 ) 
21880 6d 65 6d 45 72 72 20 3d 20 31 3b 0a 23 69 66 64  memErr = 1;.#ifd
21890 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
218a0 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 70  INT_ONLY.      p
218b0 42 6c 6f 62 2d 3e 61 50 61 72 61 6d 5b 69 5d 20  Blob->aParam[i] 
218c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
218d0 69 6e 74 36 34 28 61 41 72 67 5b 69 5d 29 3b 0a  int64(aArg[i]);.
218e0 23 65 6c 73 65 0a 20 20 20 20 20 20 70 42 6c 6f  #else.      pBlo
218f0 62 2d 3e 61 50 61 72 61 6d 5b 69 5d 20 3d 20 73  b->aParam[i] = s
21900 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
21910 62 6c 65 28 61 41 72 67 5b 69 5d 29 3b 0a 23 65  ble(aArg[i]);.#e
21920 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69  ndif.    }.    i
21930 66 28 20 6d 65 6d 45 72 72 20 29 7b 0a 20 20 20  f( memErr ){.   
21940 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
21950 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74  t_error_nomem(ct
21960 78 29 3b 0a 20 20 20 20 20 20 72 74 72 65 65 4d  x);.      rtreeM
21970 61 74 63 68 41 72 67 46 72 65 65 28 70 42 6c 6f  atchArgFree(pBlo
21980 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
21990 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
219a0 75 6c 74 5f 70 6f 69 6e 74 65 72 28 63 74 78 2c  ult_pointer(ctx,
219b0 20 70 42 6c 6f 62 2c 20 22 52 74 72 65 65 4d 61   pBlob, "RtreeMa
219c0 74 63 68 41 72 67 22 2c 20 72 74 72 65 65 4d 61  tchArg", rtreeMa
219d0 74 63 68 41 72 67 46 72 65 65 29 3b 0a 20 20 20  tchArgFree);.   
219e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
219f0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 67  Register a new g
21a00 65 6f 6d 65 74 72 79 20 66 75 6e 63 74 69 6f 6e  eometry function
21a10 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
21a20 65 20 72 2d 74 72 65 65 20 4d 41 54 43 48 20 6f  e r-tree MATCH o
21a30 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  perator..*/.int 
21a40 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
21a50 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
21a60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 2f 2a 20 52 65 67 69 73 74 65 72 20 53 51 4c   /* Register SQL
21a90 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 69   function on thi
21aa0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
21ab0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
21ac0 65 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  eom,            
21ad0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6e  /* Name of the n
21ae0 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
21af0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d  */.  int (*xGeom
21b00 29 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  )(sqlite3_rtree_
21b10 67 65 6f 6d 65 74 72 79 2a 2c 69 6e 74 2c 52 74  geometry*,int,Rt
21b20 72 65 65 44 56 61 6c 75 65 2a 2c 69 6e 74 2a 29  reeDValue*,int*)
21b30 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 2a 2f  , /* Callback */
21b40 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
21b50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
21b60 20 2f 2a 20 45 78 74 72 61 20 64 61 74 61 20 61   /* Extra data a
21b70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21b80 68 65 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29  he callback */.)
21b90 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  {.  RtreeGeomCal
21ba0 6c 62 61 63 6b 20 2a 70 47 65 6f 6d 43 74 78 3b  lback *pGeomCtx;
21bb0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
21bc0 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 65 77 20   object for new 
21bd0 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 2a 2f  user-function */
21be0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21bf0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
21c00 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 2e   context object.
21c10 20 2a 2f 0a 20 20 70 47 65 6f 6d 43 74 78 20 3d   */.  pGeomCtx =
21c20 20 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62   (RtreeGeomCallb
21c30 61 63 6b 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ack *)sqlite3_ma
21c40 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65  lloc(sizeof(Rtre
21c50 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 29 29 3b  eGeomCallback));
21c60 0a 20 20 69 66 28 20 21 70 47 65 6f 6d 43 74 78  .  if( !pGeomCtx
21c70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21c80 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 47 65 6f 6d 43  _NOMEM;.  pGeomC
21c90 74 78 2d 3e 78 47 65 6f 6d 20 3d 20 78 47 65 6f  tx->xGeom = xGeo
21ca0 6d 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78  m;.  pGeomCtx->x
21cb0 51 75 65 72 79 46 75 6e 63 20 3d 20 30 3b 0a 20  QueryFunc = 0;. 
21cc0 20 70 47 65 6f 6d 43 74 78 2d 3e 78 44 65 73 74   pGeomCtx->xDest
21cd0 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 70 47  ructor = 0;.  pG
21ce0 65 6f 6d 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74  eomCtx->pContext
21cf0 20 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 20 20 72   = pContext;.  r
21d00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
21d10 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
21d20 28 64 62 2c 20 7a 47 65 6f 6d 2c 20 2d 31 2c 20  (db, zGeom, -1, 
21d30 53 51 4c 49 54 45 5f 41 4e 59 2c 20 0a 20 20 20  SQLITE_ANY, .   
21d40 20 20 20 28 76 6f 69 64 20 2a 29 70 47 65 6f 6d     (void *)pGeom
21d50 43 74 78 2c 20 67 65 6f 6d 43 61 6c 6c 62 61 63  Ctx, geomCallbac
21d60 6b 2c 20 30 2c 20 30 2c 20 72 74 72 65 65 46 72  k, 0, 0, rtreeFr
21d70 65 65 43 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a  eeCallback.  );.
21d80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
21d90 72 20 61 20 6e 65 77 20 32 6e 64 2d 67 65 6e 65  r a new 2nd-gene
21da0 72 61 74 69 6f 6e 20 67 65 6f 6d 65 74 72 79 20  ration geometry 
21db0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 75 73 65  function for use
21dc0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 72 2d 74   with the.** r-t
21dd0 72 65 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  ree MATCH operat
21de0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
21df0 65 33 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 63  e3_rtree_query_c
21e00 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71 6c 69 74  allback(.  sqlit
21e10 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
21e20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
21e30 74 65 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ter SQL function
21e40 20 6f 6e 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   on this connect
21e50 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
21e60 68 61 72 20 2a 7a 51 75 65 72 79 46 75 6e 63 2c  har *zQueryFunc,
21e70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21e80 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
21e90 6e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 51 75  n */.  int (*xQu
21ea0 65 72 79 46 75 6e 63 29 28 73 71 6c 69 74 65 33  eryFunc)(sqlite3
21eb0 5f 72 74 72 65 65 5f 71 75 65 72 79 5f 69 6e 66  _rtree_query_inf
21ec0 6f 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  o*), /* Callback
21ed0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e   */.  void *pCon
21ee0 74 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  text,           
21ef0 20 20 20 2f 2a 20 45 78 74 72 61 20 64 61 74 61     /* Extra data
21f00 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
21f10 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
21f20 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
21f30 72 29 28 76 6f 69 64 2a 29 20 20 20 2f 2a 20 44  r)(void*)   /* D
21f40 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
21f50 65 20 65 78 74 72 61 20 64 61 74 61 20 2a 2f 0a  e extra data */.
21f60 29 7b 0a 20 20 52 74 72 65 65 47 65 6f 6d 43 61  ){.  RtreeGeomCa
21f70 6c 6c 62 61 63 6b 20 2a 70 47 65 6f 6d 43 74 78  llback *pGeomCtx
21f80 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
21f90 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 65 77  t object for new
21fa0 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 2a   user-function *
21fb0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
21fc0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
21fd0 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  e context object
21fe0 2e 20 2a 2f 0a 20 20 70 47 65 6f 6d 43 74 78 20  . */.  pGeomCtx 
21ff0 3d 20 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c  = (RtreeGeomCall
22000 62 61 63 6b 20 2a 29 73 71 6c 69 74 65 33 5f 6d  back *)sqlite3_m
22010 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72  alloc(sizeof(Rtr
22020 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 29 29  eeGeomCallback))
22030 3b 0a 20 20 69 66 28 20 21 70 47 65 6f 6d 43 74  ;.  if( !pGeomCt
22040 78 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  x ) return SQLIT
22050 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 47 65 6f 6d  E_NOMEM;.  pGeom
22060 43 74 78 2d 3e 78 47 65 6f 6d 20 3d 20 30 3b 0a  Ctx->xGeom = 0;.
22070 20 20 70 47 65 6f 6d 43 74 78 2d 3e 78 51 75 65    pGeomCtx->xQue
22080 72 79 46 75 6e 63 20 3d 20 78 51 75 65 72 79 46  ryFunc = xQueryF
22090 75 6e 63 3b 0a 20 20 70 47 65 6f 6d 43 74 78 2d  unc;.  pGeomCtx-
220a0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
220b0 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 47  Destructor;.  pG
220c0 65 6f 6d 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74  eomCtx->pContext
220d0 20 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 20 20 72   = pContext;.  r
220e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
220f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
22100 28 64 62 2c 20 7a 51 75 65 72 79 46 75 6e 63 2c  (db, zQueryFunc,
22110 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
22120 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29   .      (void *)
22130 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f 6d 43 61  pGeomCtx, geomCa
22140 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 72 74  llback, 0, 0, rt
22150 72 65 65 46 72 65 65 43 61 6c 6c 62 61 63 6b 0a  reeFreeCallback.
22160 20 20 29 3b 0a 7d 0a 0a 23 69 66 20 21 53 51 4c    );.}..#if !SQL
22170 49 54 45 5f 43 4f 52 45 0a 23 69 66 64 65 66 20  ITE_CORE.#ifdef 
22180 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65  _WIN32.__declspe
22190 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e  c(dllexport).#en
221a0 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  dif.int sqlite3_
221b0 72 74 72 65 65 5f 69 6e 69 74 28 0a 20 20 73 71  rtree_init(.  sq
221c0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 68 61  lite3 *db,.  cha
221d0 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20 20  r **pzErrMsg,.  
221e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
221f0 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69  i_routines *pApi
22200 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54  .){.  SQLITE_EXT
22210 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70  ENSION_INIT2(pAp
22220 69 29 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  i).  return sqli
22230 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
22240 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  ;.}.#endif..#end
22250 69 66 0a                                         if.