/ Hex Artifact Content
Login

Artifact 2d9f95da404d850474e628c720c5ce15d29b47de:


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 29 0a 2a 2a 0a  eno INTEGER).**.
0410: 2a 2a 20 54 68 65 20 64 61 74 61 20 66 6f 72 20  ** The data for 
0420: 65 61 63 68 20 6e 6f 64 65 20 6f 66 20 74 68 65  each node of the
0430: 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
0440: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
0450: 68 65 20 25 5f 6e 6f 64 65 0a 2a 2a 20 74 61 62  he %_node.** tab
0460: 6c 65 2e 20 46 6f 72 20 65 61 63 68 20 6e 6f 64  le. For each nod
0470: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68  e that is not th
0480: 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  e root node of t
0490: 68 65 20 72 2d 74 72 65 65 2c 20 74 68 65 72 65  he r-tree, there
04a0: 20 69 73 0a 2a 2a 20 61 6e 20 65 6e 74 72 79 20   is.** an entry 
04b0: 69 6e 20 74 68 65 20 25 5f 70 61 72 65 6e 74 20  in the %_parent 
04c0: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 69 6e  table associatin
04d0: 67 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20  g the node with 
04e0: 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 20 41  its parent..** A
04f0: 6e 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  nd for each row 
0500: 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  of data in the t
0510: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 61  able, there is a
0520: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25  n entry in the %
0530: 5f 72 6f 77 69 64 0a 2a 2a 20 74 61 62 6c 65 20  _rowid.** table 
0540: 74 68 61 74 20 6d 61 70 73 20 66 72 6f 6d 20 74  that maps from t
0550: 68 65 20 65 6e 74 72 69 65 73 20 72 6f 77 69 64  he entries rowid
0560: 20 74 6f 20 74 68 65 20 69 64 20 6f 66 20 74 68   to the id of th
0570: 65 20 6e 6f 64 65 20 74 68 61 74 20 69 74 0a 2a  e node that it.*
0580: 2a 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 2e 0a  * is stored on..
0590: 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 6e  **.** The root n
05a0: 6f 64 65 20 6f 66 20 61 6e 20 72 2d 74 72 65 65  ode of an r-tree
05b0: 20 61 6c 77 61 79 73 20 65 78 69 73 74 73 2c 20   always exists, 
05c0: 65 76 65 6e 20 69 66 20 74 68 65 20 72 2d 74 72  even if the r-tr
05d0: 65 65 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 65  ee table is.** e
05e0: 6d 70 74 79 2e 20 54 68 65 20 6e 6f 64 65 6e 6f  mpty. The nodeno
05f0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   of the root nod
0600: 65 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 41  e is always 1. A
0610: 6c 6c 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 69  ll other nodes i
0620: 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d  n the.** table m
0630: 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
0640: 73 69 7a 65 20 61 73 20 74 68 65 20 72 6f 6f 74  size as the root
0650: 20 6e 6f 64 65 2e 20 54 68 65 20 63 6f 6e 74 65   node. The conte
0660: 6e 74 20 6f 66 20 65 61 63 68 20 6e 6f 64 65 0a  nt of each node.
0670: 2a 2a 20 69 73 20 66 6f 72 6d 61 74 74 65 64 20  ** is formatted 
0680: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
0690: 2a 20 20 20 31 2e 20 49 66 20 74 68 65 20 6e 6f  *   1. If the no
06a0: 64 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e  de is the root n
06b0: 6f 64 65 20 28 6e 6f 64 65 20 31 29 2c 20 74 68  ode (node 1), th
06c0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 32 20 62  en the first 2 b
06d0: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ytes.**      of 
06e0: 74 68 65 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  the node contain
06f0: 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 20   the tree depth 
0700: 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  as a big-endian 
0710: 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 20 20 20 20  integer..**     
0720: 20 46 6f 72 20 6e 6f 6e 2d 72 6f 6f 74 20 6e 6f   For non-root no
0730: 64 65 73 2c 20 74 68 65 20 66 69 72 73 74 20 32  des, the first 2
0740: 20 62 79 74 65 73 20 61 72 65 20 6c 65 66 74 20   bytes are left 
0750: 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  unused..**.**   
0760: 32 2e 20 54 68 65 20 6e 65 78 74 20 32 20 62 79  2. The next 2 by
0770: 74 65 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  tes contain the 
0780: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
0790: 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
07a0: 20 20 20 20 20 73 74 6f 72 65 64 20 69 6e 20 74       stored in t
07b0: 68 65 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20  he node..**.**  
07c0: 20 33 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65   3. The remainde
07d0: 72 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 63 6f  r of the node co
07e0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 6f 64 65 20  ntains the node 
07f0: 65 6e 74 72 69 65 73 2e 20 45 61 63 68 20 65 6e  entries. Each en
0800: 74 72 79 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 73  try.**      cons
0810: 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
0820: 20 38 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   8-byte integer 
0830: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 65  followed by an e
0840: 76 65 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ven number.**   
0850: 20 20 20 6f 66 20 34 2d 62 79 74 65 20 63 6f 6f     of 4-byte coo
0860: 72 64 69 6e 61 74 65 73 2e 20 46 6f 72 20 6c 65  rdinates. For le
0870: 61 66 20 6e 6f 64 65 73 20 74 68 65 20 69 6e 74  af nodes the int
0880: 65 67 65 72 20 69 73 20 74 68 65 20 72 6f 77 69  eger is the rowi
0890: 64 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 72  d.**      of a r
08a0: 65 63 6f 72 64 2e 20 46 6f 72 20 69 6e 74 65 72  ecord. For inter
08b0: 6e 61 6c 20 6e 6f 64 65 73 20 69 74 20 69 73 20  nal nodes it is 
08c0: 74 68 65 20 6e 6f 64 65 20 6e 75 6d 62 65 72 20  the node number 
08d0: 6f 66 20 61 0a 2a 2a 20 20 20 20 20 20 63 68 69  of a.**      chi
08e0: 6c 64 20 70 61 67 65 2e 0a 2a 2f 0a 0a 23 69 66  ld page..*/..#if
08f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0900: 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65  _CORE) || define
0910: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
0920: 52 54 52 45 45 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  RTREE)../*.** Th
0930: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0940: 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
0950: 6f 6e 20 6f 66 20 61 20 63 6f 75 70 6c 65 20 6f  on of a couple o
0960: 66 20 64 69 66 66 65 72 65 6e 74 20 76 61 72 69  f different vari
0970: 61 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ants.** of the r
0980: 2d 74 72 65 65 20 61 6c 67 6f 72 69 74 68 6d 2e  -tree algorithm.
0990: 20 53 65 65 20 74 68 65 20 52 45 41 44 4d 45 20   See the README 
09a0: 66 69 6c 65 20 66 6f 72 20 66 75 72 74 68 65 72  file for further
09b0: 20 64 65 74 61 69 6c 73 2e 20 54 68 65 20 0a 2a   details. The .*
09c0: 2a 20 73 61 6d 65 20 64 61 74 61 2d 73 74 72 75  * same data-stru
09d0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 66 6f  cture is used fo
09e0: 72 20 61 6c 6c 2c 20 62 75 74 20 74 68 65 20 61  r all, but the a
09f0: 6c 67 6f 72 69 74 68 6d 73 20 66 6f 72 20 69 6e  lgorithms for in
0a00: 73 65 72 74 20 61 6e 64 0a 2a 2a 20 64 65 6c 65  sert and.** dele
0a10: 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 76 61  te operations va
0a20: 72 79 2e 20 54 68 65 20 76 61 72 69 61 6e 74 73  ry. The variants
0a30: 20 75 73 65 64 20 61 72 65 20 73 65 6c 65 63 74   used are select
0a40: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
0a50: 6d 65 20 0a 2a 2a 20 62 79 20 64 65 66 69 6e 69  me .** by defini
0a60: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
0a70: 20 73 79 6d 62 6f 6c 73 3a 0a 2a 2f 0a 0a 2f 2a   symbols:.*/../*
0a80: 20 45 69 74 68 65 72 2c 20 62 6f 74 68 20 6f 72   Either, both or
0a90: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
0aa0: 6c 6f 77 69 6e 67 20 6d 61 79 20 62 65 20 73 65  lowing may be se
0ab0: 74 20 74 6f 20 61 63 74 69 76 61 74 65 20 0a 2a  t to activate .*
0ac0: 2a 20 72 2a 74 72 65 65 20 76 61 72 69 61 6e 74  * r*tree variant
0ad0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 0a 2a 2f 0a   algorithms..*/.
0ae0: 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f  #define VARIANT_
0af0: 52 53 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45  RSTARTREE_CHOOSE
0b00: 53 55 42 54 52 45 45 20 30 0a 23 64 65 66 69 6e  SUBTREE 0.#defin
0b10: 65 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54  e VARIANT_RSTART
0b20: 52 45 45 5f 52 45 49 4e 53 45 52 54 20 20 20 20  REE_REINSERT    
0b30: 20 20 31 0a 0a 2f 2a 20 0a 2a 2a 20 45 78 61 63    1../* .** Exac
0b40: 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
0b50: 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65  ollowing must be
0b60: 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 23 64   set to 1..*/.#d
0b70: 65 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55  efine VARIANT_GU
0b80: 54 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f  TTMAN_QUADRATIC_
0b90: 53 50 4c 49 54 20 30 0a 23 64 65 66 69 6e 65 20  SPLIT 0.#define 
0ba0: 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f  VARIANT_GUTTMAN_
0bb0: 4c 49 4e 45 41 52 5f 53 50 4c 49 54 20 20 20 20  LINEAR_SPLIT    
0bc0: 30 0a 23 64 65 66 69 6e 65 20 56 41 52 49 41 4e  0.#define VARIAN
0bd0: 54 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c 49  T_RSTARTREE_SPLI
0be0: 54 20 20 20 20 20 20 20 20 20 31 0a 0a 23 64 65  T         1..#de
0bf0: 66 69 6e 65 20 56 41 52 49 41 4e 54 5f 47 55 54  fine VARIANT_GUT
0c00: 54 4d 41 4e 5f 53 50 4c 49 54 20 5c 0a 20 20 20  TMAN_SPLIT \.   
0c10: 20 20 20 20 20 28 56 41 52 49 41 4e 54 5f 47 55       (VARIANT_GU
0c20: 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c  TTMAN_LINEAR_SPL
0c30: 49 54 7c 7c 56 41 52 49 41 4e 54 5f 47 55 54 54  IT||VARIANT_GUTT
0c40: 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f 53 50  MAN_QUADRATIC_SP
0c50: 4c 49 54 29 0a 0a 23 69 66 20 56 41 52 49 41 4e  LIT)..#if VARIAN
0c60: 54 5f 47 55 54 54 4d 41 4e 5f 51 55 41 44 52 41  T_GUTTMAN_QUADRA
0c70: 54 49 43 5f 53 50 4c 49 54 0a 20 20 23 64 65 66  TIC_SPLIT.  #def
0c80: 69 6e 65 20 50 69 63 6b 4e 65 78 74 20 51 75 61  ine PickNext Qua
0c90: 64 72 61 74 69 63 50 69 63 6b 4e 65 78 74 0a 20  draticPickNext. 
0ca0: 20 23 64 65 66 69 6e 65 20 50 69 63 6b 53 65 65   #define PickSee
0cb0: 64 73 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  ds QuadraticPick
0cc0: 53 65 65 64 73 0a 20 20 23 64 65 66 69 6e 65 20  Seeds.  #define 
0cd0: 41 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69  AssignCells spli
0ce0: 74 4e 6f 64 65 47 75 74 74 6d 61 6e 0a 23 65 6e  tNodeGuttman.#en
0cf0: 64 69 66 0a 23 69 66 20 56 41 52 49 41 4e 54 5f  dif.#if VARIANT_
0d00: 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f 53  GUTTMAN_LINEAR_S
0d10: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 50  PLIT.  #define P
0d20: 69 63 6b 4e 65 78 74 20 4c 69 6e 65 61 72 50 69  ickNext LinearPi
0d30: 63 6b 4e 65 78 74 0a 20 20 23 64 65 66 69 6e 65  ckNext.  #define
0d40: 20 50 69 63 6b 53 65 65 64 73 20 4c 69 6e 65 61   PickSeeds Linea
0d50: 72 50 69 63 6b 53 65 65 64 73 0a 20 20 23 64 65  rPickSeeds.  #de
0d60: 66 69 6e 65 20 41 73 73 69 67 6e 43 65 6c 6c 73  fine AssignCells
0d70: 20 73 70 6c 69 74 4e 6f 64 65 47 75 74 74 6d 61   splitNodeGuttma
0d80: 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 56 41 52  n.#endif.#if VAR
0d90: 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 53  IANT_RSTARTREE_S
0da0: 50 4c 49 54 0a 20 20 23 64 65 66 69 6e 65 20 41  PLIT.  #define A
0db0: 73 73 69 67 6e 43 65 6c 6c 73 20 73 70 6c 69 74  ssignCells split
0dc0: 4e 6f 64 65 53 74 61 72 74 72 65 65 0a 23 65 6e  NodeStartree.#en
0dd0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0de0: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
0df0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
0e00: 55 47 29 20 0a 23 20 64 65 66 69 6e 65 20 4e 44  UG) .# define ND
0e10: 45 42 55 47 20 31 0a 23 65 6e 64 69 66 0a 0a 23  EBUG 1.#endif..#
0e20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  ifndef SQLITE_CO
0e30: 52 45 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73  RE.  #include "s
0e40: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20 53  qlite3ext.h".  S
0e50: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
0e60: 49 4e 49 54 31 0a 23 65 6c 73 65 0a 20 20 23 69  INIT1.#else.  #i
0e70: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0e80: 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c  h".#endif..#incl
0e90: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0ea0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0eb0: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
0ec0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0ed0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0ee0: 33 72 74 72 65 65 2e 68 22 0a 74 79 70 65 64 65  3rtree.h".typede
0ef0: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0f00: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 75 6e 73  i64;.typedef uns
0f10: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 74  igned char u8;.t
0f20: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0f30: 69 6e 74 20 75 33 32 3b 0a 23 65 6e 64 69 66 0a  int u32;.#endif.
0f40: 0a 2f 2a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ./*  The followi
0f50: 6e 67 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  ng macro is used
0f60: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0f70: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 2e 0a  piler warnings..
0f80: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0f90: 44 5f 50 41 52 41 4d 45 54 45 52 0a 23 20 64 65  D_PARAMETER.# de
0fa0: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
0fb0: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
0fc0: 78 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  x).#endif..typed
0fd0: 65 66 20 73 74 72 75 63 74 20 52 74 72 65 65 20  ef struct Rtree 
0fe0: 52 74 72 65 65 3b 0a 74 79 70 65 64 65 66 20 73  Rtree;.typedef s
0ff0: 74 72 75 63 74 20 52 74 72 65 65 43 75 72 73 6f  truct RtreeCurso
1000: 72 20 52 74 72 65 65 43 75 72 73 6f 72 3b 0a 74  r RtreeCursor;.t
1010: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 74  ypedef struct Rt
1020: 72 65 65 4e 6f 64 65 20 52 74 72 65 65 4e 6f 64  reeNode RtreeNod
1030: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1040: 74 20 52 74 72 65 65 43 65 6c 6c 20 52 74 72 65  t RtreeCell Rtre
1050: 65 43 65 6c 6c 3b 0a 74 79 70 65 64 65 66 20 73  eCell;.typedef s
1060: 74 72 75 63 74 20 52 74 72 65 65 43 6f 6e 73 74  truct RtreeConst
1070: 72 61 69 6e 74 20 52 74 72 65 65 43 6f 6e 73 74  raint RtreeConst
1080: 72 61 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73  raint;.typedef s
1090: 74 72 75 63 74 20 52 74 72 65 65 4d 61 74 63 68  truct RtreeMatch
10a0: 41 72 67 20 52 74 72 65 65 4d 61 74 63 68 41 72  Arg RtreeMatchAr
10b0: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
10c0: 74 20 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  t RtreeGeomCallb
10d0: 61 63 6b 20 52 74 72 65 65 47 65 6f 6d 43 61 6c  ack RtreeGeomCal
10e0: 6c 62 61 63 6b 3b 0a 74 79 70 65 64 65 66 20 75  lback;.typedef u
10f0: 6e 69 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20  nion RtreeCoord 
1100: 52 74 72 65 65 43 6f 6f 72 64 3b 0a 0a 2f 2a 20  RtreeCoord;../* 
1110: 54 68 65 20 72 74 72 65 65 20 6d 61 79 20 68 61  The rtree may ha
1120: 76 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  ve between 1 and
1130: 20 52 54 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e   RTREE_MAX_DIMEN
1140: 53 49 4f 4e 53 20 64 69 6d 65 6e 73 69 6f 6e 73  SIONS dimensions
1150: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54 52  . */.#define RTR
1160: 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e  EE_MAX_DIMENSION
1170: 53 20 35 0a 0a 2f 2a 20 53 69 7a 65 20 6f 66 20  S 5../* Size of 
1180: 68 61 73 68 20 74 61 62 6c 65 20 52 74 72 65 65  hash table Rtree
1190: 2e 61 48 61 73 68 2e 20 54 68 69 73 20 68 61 73  .aHash. This has
11a0: 68 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65  h table is not e
11b0: 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 65 76  xpected to.** ev
11c0: 65 72 20 63 6f 6e 74 61 69 6e 20 76 65 72 79 20  er contain very 
11d0: 6d 61 6e 79 20 65 6e 74 72 69 65 73 2c 20 73 6f  many entries, so
11e0: 20 61 20 66 69 78 65 64 20 6e 75 6d 62 65 72 20   a fixed number 
11f0: 6f 66 20 62 75 63 6b 65 74 73 20 69 73 20 0a 2a  of buckets is .*
1200: 2a 20 75 73 65 64 2e 0a 2a 2f 0a 23 64 65 66 69  * used..*/.#defi
1210: 6e 65 20 48 41 53 48 53 49 5a 45 20 31 32 38 0a  ne HASHSIZE 128.
1220: 0a 2f 2a 20 54 68 65 20 78 42 65 73 74 49 6e 64  ./* The xBestInd
1230: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 69  ex method of thi
1240: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
1250: 72 65 71 75 69 72 65 73 20 61 6e 20 65 73 74 69  requires an esti
1260: 6d 61 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  mate of.** the n
1270: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1280: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1290: 6c 65 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  le to calculate 
12a0: 74 68 65 20 63 6f 73 74 73 20 6f 66 0a 2a 2a 20  the costs of.** 
12b0: 76 61 72 69 6f 75 73 20 73 74 72 61 74 65 67 69  various strategi
12c0: 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
12d0: 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 69   this estimate i
12e0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  s loaded from th
12f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
1300: 31 20 74 61 62 6c 65 20 28 77 69 74 68 20 52 54  1 table (with RT
1310: 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 61  REE_MIN_ROWEST a
1320: 73 20 61 20 68 61 72 64 2d 63 6f 64 65 64 20 6d  s a hard-coded m
1330: 69 6e 69 6d 75 6d 29 2e 0a 2a 2a 20 4f 74 68 65  inimum)..** Othe
1340: 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 73 71 6c  rwise, if no sql
1350: 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20  ite_stat1 entry 
1360: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73  is available, us
1370: 65 20 0a 2a 2a 20 52 54 52 45 45 5f 44 45 46 41  e .** RTREE_DEFA
1380: 55 4c 54 5f 52 4f 57 45 53 54 2e 0a 2a 2f 0a 23  ULT_ROWEST..*/.#
1390: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 44 45 46  define RTREE_DEF
13a0: 41 55 4c 54 5f 52 4f 57 45 53 54 20 31 30 34 38  AULT_ROWEST 1048
13b0: 35 37 36 0a 23 64 65 66 69 6e 65 20 52 54 52 45  576.#define RTRE
13c0: 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 20 20 20 20  E_MIN_ROWEST    
13d0: 20 20 20 20 20 31 30 30 0a 0a 2f 2a 20 0a 2a 2a       100../* .**
13e0: 20 41 6e 20 72 74 72 65 65 20 76 69 72 74 75 61   An rtree virtua
13f0: 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a  l-table object..
1400: 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65 65 20  */.struct Rtree 
1410: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
1420: 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33   base;.  sqlite3
1430: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1440: 20 20 20 20 20 2f 2a 20 48 6f 73 74 20 64 61 74       /* Host dat
1450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1460: 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 6f 64 65 53   */.  int iNodeS
1470: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1480: 20 20 2f 2a 20 53 69 7a 65 20 69 6e 20 62 79 74    /* Size in byt
1490: 65 73 20 6f 66 20 65 61 63 68 20 6e 6f 64 65 20  es of each node 
14a0: 69 6e 20 74 68 65 20 6e 6f 64 65 20 74 61 62 6c  in the node tabl
14b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 6d 3b  e */.  int nDim;
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14e0: 64 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 20 20  dimensions */.  
14f0: 69 6e 74 20 6e 42 79 74 65 73 50 65 72 43 65 6c  int nBytesPerCel
1500: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  l;          /* B
1510: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 20 70 65  ytes consumed pe
1520: 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  r cell */.  int 
1530: 69 44 65 70 74 68 3b 20 20 20 20 20 20 20 20 20  iDepth;         
1540: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1550: 6e 74 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  nt depth of the 
1560: 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  r-tree structure
1570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
15a0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
15b0: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 2a 2f   r-tree table */
15c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e0: 2a 20 4e 61 6d 65 20 6f 66 20 72 2d 74 72 65 65  * Name of r-tree
15f0: 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 52 74 72   table */ .  Rtr
1600: 65 65 4e 6f 64 65 20 2a 61 48 61 73 68 5b 48 41  eeNode *aHash[HA
1610: 53 48 53 49 5a 45 5d 3b 20 2f 2a 20 48 61 73 68  SHSIZE]; /* Hash
1620: 20 74 61 62 6c 65 20 6f 66 20 69 6e 2d 6d 65 6d   table of in-mem
1630: 6f 72 79 20 6e 6f 64 65 73 2e 20 2a 2f 20 0a 20  ory nodes. */ . 
1640: 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20 20   int nBusy;     
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1660: 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
1670: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
1690: 36 34 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  64 nRowEst;     
16a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
16b0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
16c0: 66 20 72 6f 77 73 20 69 6e 20 74 68 69 73 20 74  f rows in this t
16d0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 69  able */..  /* Li
16e0: 73 74 20 6f 66 20 6e 6f 64 65 73 20 72 65 6d 6f  st of nodes remo
16f0: 76 65 64 20 64 75 72 69 6e 67 20 61 20 43 6f 6e  ved during a Con
1700: 64 65 6e 73 65 54 72 65 65 20 6f 70 65 72 61 74  denseTree operat
1710: 69 6f 6e 2e 20 4c 69 73 74 20 69 73 0a 20 20 2a  ion. List is.  *
1720: 2a 20 6c 69 6e 6b 65 64 20 74 6f 67 65 74 68 65  * linked togethe
1730: 72 20 76 69 61 20 74 68 65 20 70 6f 69 6e 74 65  r via the pointe
1740: 72 20 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 64 20  r normally used 
1750: 66 6f 72 20 68 61 73 68 20 63 68 61 69 6e 73 20  for hash chains 
1760: 2d 0a 20 20 2a 2a 20 52 74 72 65 65 4e 6f 64 65  -.  ** RtreeNode
1770: 2e 70 4e 65 78 74 2e 20 52 74 72 65 65 4e 6f 64  .pNext. RtreeNod
1780: 65 2e 69 4e 6f 64 65 20 73 74 6f 72 65 73 20 74  e.iNode stores t
1790: 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
17a0: 73 75 62 2d 74 72 65 65 20 0a 20 20 2a 2a 20 68  sub-tree .  ** h
17b0: 65 61 64 65 64 20 62 79 20 74 68 65 20 6e 6f 64  eaded by the nod
17c0: 65 20 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61  e (leaf nodes ha
17d0: 76 65 20 52 74 72 65 65 4e 6f 64 65 2e 69 4e 6f  ve RtreeNode.iNo
17e0: 64 65 3d 3d 30 29 2e 0a 20 20 2a 2f 0a 20 20 52  de==0)..  */.  R
17f0: 74 72 65 65 4e 6f 64 65 20 2a 70 44 65 6c 65 74  treeNode *pDelet
1800: 65 64 3b 0a 20 20 69 6e 74 20 69 52 65 69 6e 73  ed;.  int iReins
1810: 65 72 74 48 65 69 67 68 74 3b 20 20 20 20 20 20  ertHeight;      
1820: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73    /* Height of s
1830: 75 62 2d 74 72 65 65 73 20 52 65 69 6e 73 65 72  ub-trees Reinser
1840: 74 28 29 20 68 61 73 20 72 75 6e 20 6f 6e 20 2a  t() has run on *
1850: 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  /..  /* Statemen
1860: 74 73 20 74 6f 20 72 65 61 64 2f 77 72 69 74 65  ts to read/write
1870: 2f 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64  /delete a record
1880: 20 66 72 6f 6d 20 78 78 78 5f 6e 6f 64 65 20 2a   from xxx_node *
1890: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
18a0: 20 2a 70 52 65 61 64 4e 6f 64 65 3b 0a 20 20 73   *pReadNode;.  s
18b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
18c0: 69 74 65 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74  iteNode;.  sqlit
18d0: 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
18e0: 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 53 74 61 74  Node;..  /* Stat
18f0: 65 6d 65 6e 74 73 20 74 6f 20 72 65 61 64 2f 77  ements to read/w
1900: 72 69 74 65 2f 64 65 6c 65 74 65 20 61 20 72 65  rite/delete a re
1910: 63 6f 72 64 20 66 72 6f 6d 20 78 78 78 5f 72 6f  cord from xxx_ro
1920: 77 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  wid */.  sqlite3
1930: 5f 73 74 6d 74 20 2a 70 52 65 61 64 52 6f 77 69  _stmt *pReadRowi
1940: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  d;.  sqlite3_stm
1950: 74 20 2a 70 57 72 69 74 65 52 6f 77 69 64 3b 0a  t *pWriteRowid;.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1970: 70 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 0a 20  pDeleteRowid;.. 
1980: 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 74   /* Statements t
1990: 6f 20 72 65 61 64 2f 77 72 69 74 65 2f 64 65 6c  o read/write/del
19a0: 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ete a record fro
19b0: 6d 20 78 78 78 5f 70 61 72 65 6e 74 20 2a 2f 0a  m xxx_parent */.
19c0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19d0: 70 52 65 61 64 50 61 72 65 6e 74 3b 0a 20 20 73  pReadParent;.  s
19e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
19f0: 69 74 65 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  iteParent;.  sql
1a00: 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65  ite3_stmt *pDele
1a10: 74 65 50 61 72 65 6e 74 3b 0a 0a 20 20 69 6e 74  teParent;..  int
1a20: 20 65 43 6f 6f 72 64 54 79 70 65 3b 0a 7d 3b 0a   eCoordType;.};.
1a30: 0a 2f 2a 20 50 6f 73 73 69 62 6c 65 20 76 61 6c  ./* Possible val
1a40: 75 65 73 20 66 6f 72 20 65 43 6f 6f 72 64 54 79  ues for eCoordTy
1a50: 70 65 3a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  pe: */.#define R
1a60: 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33  TREE_COORD_REAL3
1a70: 32 20 30 0a 23 64 65 66 69 6e 65 20 52 54 52 45  2 0.#define RTRE
1a80: 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 20 20 31  E_COORD_INT32  1
1a90: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
1aa0: 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
1ab0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1ac0: 6e 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  n this virtual t
1ad0: 61 62 6c 65 20 77 69 6c 6c 0a 2a 2a 20 6f 6e 6c  able will.** onl
1ae0: 79 20 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65  y deal with inte
1af0: 67 65 72 20 63 6f 6f 72 64 69 6e 61 74 65 73 2e  ger coordinates.
1b00: 20 20 4e 6f 20 66 6c 6f 61 74 69 6e 67 20 70 6f    No floating po
1b10: 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a  int operations.*
1b20: 2a 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 0a  * will be done..
1b30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b40: 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
1b50: 20 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65    typedef sqlite
1b60: 33 5f 69 6e 74 36 34 20 52 74 72 65 65 44 56 61  3_int64 RtreeDVa
1b70: 6c 75 65 3b 20 20 20 20 20 20 20 2f 2a 20 48 69  lue;       /* Hi
1b80: 67 68 20 61 63 63 75 72 61 63 79 20 63 6f 6f 72  gh accuracy coor
1b90: 64 69 6e 61 74 65 20 2a 2f 0a 20 20 74 79 70 65  dinate */.  type
1ba0: 64 65 66 20 69 6e 74 20 52 74 72 65 65 56 61 6c  def int RtreeVal
1bb0: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
1bc0: 20 20 20 20 20 2f 2a 20 4c 6f 77 20 61 63 63 75       /* Low accu
1bd0: 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20  racy coordinate 
1be0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 74 79 70 65 64  */.#else.  typed
1bf0: 65 66 20 64 6f 75 62 6c 65 20 52 74 72 65 65 44  ef double RtreeD
1c00: 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20  Value;          
1c10: 20 20 20 20 2f 2a 20 48 69 67 68 20 61 63 63 75      /* High accu
1c20: 72 61 63 79 20 63 6f 6f 72 64 69 6e 61 74 65 20  racy coordinate 
1c30: 2a 2f 0a 20 20 74 79 70 65 64 65 66 20 66 6c 6f  */.  typedef flo
1c40: 61 74 20 52 74 72 65 65 56 61 6c 75 65 3b 20 20  at RtreeValue;  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 4c 6f 77 20 61 63 63 75 72 61 63 79 20 63 6f   Low accuracy co
1c70: 6f 72 64 69 6e 61 74 65 20 2a 2f 0a 23 65 6e 64  ordinate */.#end
1c80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 69  if../*.** The mi
1c90: 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
1ca0: 63 65 6c 6c 73 20 61 6c 6c 6f 77 65 64 20 66 6f  cells allowed fo
1cb0: 72 20 61 20 6e 6f 64 65 20 69 73 20 61 20 74 68  r a node is a th
1cc0: 69 72 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6d  ird of the .** m
1cd0: 61 78 69 6d 75 6d 2e 20 49 6e 20 47 75 74 6d 61  aximum. In Gutma
1ce0: 6e 27 73 20 6e 6f 74 61 74 69 6f 6e 3a 0a 2a 2a  n's notation:.**
1cf0: 0a 2a 2a 20 20 20 20 20 6d 20 3d 20 4d 2f 33 0a  .**     m = M/3.
1d00: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 52 2a 2d 74  **.** If an R*-t
1d10: 72 65 65 20 22 52 65 69 6e 73 65 72 74 22 20 6f  ree "Reinsert" o
1d20: 70 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75  peration is requ
1d30: 69 72 65 64 2c 20 74 68 65 20 73 61 6d 65 20 6e  ired, the same n
1d40: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1d50: 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20 66 72  s are removed fr
1d60: 6f 6d 20 74 68 65 20 6f 76 65 72 66 75 6c 6c 20  om the overfull 
1d70: 6e 6f 64 65 20 61 6e 64 20 72 65 69 6e 73 65 72  node and reinser
1d80: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74 72 65  ted into the tre
1d90: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  e..*/.#define RT
1da0: 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 29 20  REE_MINCELLS(p) 
1db0: 28 28 28 28 70 29 2d 3e 69 4e 6f 64 65 53 69 7a  ((((p)->iNodeSiz
1dc0: 65 2d 34 29 2f 28 70 29 2d 3e 6e 42 79 74 65 73  e-4)/(p)->nBytes
1dd0: 50 65 72 43 65 6c 6c 29 2f 33 29 0a 23 64 65 66  PerCell)/3).#def
1de0: 69 6e 65 20 52 54 52 45 45 5f 52 45 49 4e 53 45  ine RTREE_REINSE
1df0: 52 54 28 70 29 20 52 54 52 45 45 5f 4d 49 4e 43  RT(p) RTREE_MINC
1e00: 45 4c 4c 53 28 70 29 0a 23 64 65 66 69 6e 65 20  ELLS(p).#define 
1e10: 52 54 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 35  RTREE_MAXCELLS 5
1e20: 31 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 6d 61  1../*.** The sma
1e30: 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 6e  llest possible n
1e40: 6f 64 65 2d 73 69 7a 65 20 69 73 20 28 35 31 32  ode-size is (512
1e50: 2d 36 34 29 3d 3d 34 34 38 20 62 79 74 65 73 2e  -64)==448 bytes.
1e60: 20 41 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74   And the largest
1e70: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 63 65  .** supported ce
1e80: 6c 6c 20 73 69 7a 65 20 69 73 20 34 38 20 62 79  ll size is 48 by
1e90: 74 65 73 20 28 38 20 62 79 74 65 20 72 6f 77 69  tes (8 byte rowi
1ea0: 64 20 2b 20 74 65 6e 20 34 20 62 79 74 65 20 63  d + ten 4 byte c
1eb0: 6f 6f 72 64 69 6e 61 74 65 73 29 2e 0a 2a 2a 20  oordinates)..** 
1ec0: 54 68 65 72 65 66 6f 72 65 20 61 6c 6c 20 6e 6f  Therefore all no
1ed0: 6e 2d 72 6f 6f 74 20 6e 6f 64 65 73 20 6d 75 73  n-root nodes mus
1ee0: 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  t contain at lea
1ef0: 73 74 20 33 20 65 6e 74 72 69 65 73 2e 20 53 69  st 3 entries. Si
1f00: 6e 63 65 20 0a 2a 2a 20 32 5e 34 30 20 69 73 20  nce .** 2^40 is 
1f10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 5e 36  greater than 2^6
1f20: 34 2c 20 61 6e 20 72 2d 74 72 65 65 20 73 74 72  4, an r-tree str
1f30: 75 63 74 75 72 65 20 61 6c 77 61 79 73 20 68 61  ucture always ha
1f40: 73 20 61 20 64 65 70 74 68 20 6f 66 0a 2a 2a 20  s a depth of.** 
1f50: 34 30 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 23  40 or less..*/.#
1f60: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4d 41 58  define RTREE_MAX
1f70: 5f 44 45 50 54 48 20 34 30 0a 0a 2f 2a 20 0a 2a  _DEPTH 40../* .*
1f80: 2a 20 41 6e 20 72 74 72 65 65 20 63 75 72 73 6f  * An rtree curso
1f90: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  r object..*/.str
1fa0: 75 63 74 20 52 74 72 65 65 43 75 72 73 6f 72 20  uct RtreeCursor 
1fb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
1fc0: 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 0a 20 20  _cursor base;.  
1fd0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
1fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff0: 20 20 2f 2a 20 4e 6f 64 65 20 63 75 72 73 6f 72    /* Node cursor
2000: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2010: 69 6e 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 69  inting at */.  i
2020: 6e 74 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt iCell;       
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
2050: 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 4e 6f  rent cell in pNo
2060: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 72  de */.  int iStr
2070: 61 74 65 67 79 3b 20 20 20 20 20 20 20 20 20 20  ategy;          
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
2090: 79 20 6f 66 20 69 64 78 4e 75 6d 20 73 65 61 72  y of idxNum sear
20a0: 63 68 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ch parameter */.
20b0: 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
20c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 43 6f 6e   entries in aCon
20f0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 52 74 72  straint */.  Rtr
2100: 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  eeConstraint *aC
2110: 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 2f  onstraint;     /
2120: 2a 20 53 65 61 72 63 68 20 63 6f 6e 73 74 72 61  * Search constra
2130: 69 6e 74 73 2e 20 2a 2f 0a 7d 3b 0a 0a 75 6e 69  ints. */.};..uni
2140: 6f 6e 20 52 74 72 65 65 43 6f 6f 72 64 20 7b 0a  on RtreeCoord {.
2150: 20 20 52 74 72 65 65 56 61 6c 75 65 20 66 3b 0a    RtreeValue f;.
2160: 20 20 69 6e 74 20 69 3b 0a 7d 3b 0a 0a 2f 2a 0a    int i;.};../*.
2170: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
2180: 69 73 20 61 6e 20 52 74 72 65 65 43 6f 6f 72 64  is an RtreeCoord
2190: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  . Return the val
21a0: 75 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ue stored within
21b0: 20 74 68 65 20 52 74 72 65 65 43 6f 6f 72 64 0a   the RtreeCoord.
21c0: 2a 2a 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  ** formatted as 
21d0: 61 20 52 74 72 65 65 44 56 61 6c 75 65 20 28 64  a RtreeDValue (d
21e0: 6f 75 62 6c 65 20 6f 72 20 69 6e 74 36 34 29 2e  ouble or int64).
21f0: 20 54 68 69 73 20 6d 61 63 72 6f 20 61 73 73 75   This macro assu
2200: 6d 65 73 20 74 68 61 74 20 6c 6f 63 61 6c 0a 2a  mes that local.*
2210: 2a 20 76 61 72 69 61 62 6c 65 20 70 52 74 72 65  * variable pRtre
2220: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
2230: 52 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  Rtree structure 
2240: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2250: 74 68 65 0a 2a 2a 20 52 74 72 65 65 43 6f 6f 72  the.** RtreeCoor
2260: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
2270: 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e  ITE_RTREE_INT_ON
2280: 4c 59 0a 23 20 64 65 66 69 6e 65 20 44 43 4f 4f  LY.# define DCOO
2290: 52 44 28 63 6f 6f 72 64 29 20 28 28 52 74 72 65  RD(coord) ((Rtre
22a0: 65 44 56 61 6c 75 65 29 63 6f 6f 72 64 2e 69 29  eDValue)coord.i)
22b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
22c0: 44 43 4f 4f 52 44 28 63 6f 6f 72 64 29 20 28 20  DCOORD(coord) ( 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
22f0: 28 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54  (pRtree->eCoordT
2300: 79 70 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44  ype==RTREE_COORD
2310: 5f 52 45 41 4c 33 32 29 20 3f 20 20 20 20 20 20  _REAL32) ?      
2320: 5c 0a 20 20 20 20 20 20 28 28 64 6f 75 62 6c 65  \.      ((double
2330: 29 63 6f 6f 72 64 2e 66 29 20 3a 20 20 20 20 20  )coord.f) :     
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 28 28        \.      ((
2360: 64 6f 75 62 6c 65 29 63 6f 6f 72 64 2e 69 29 20  double)coord.i) 
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2390: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23a0: 41 20 73 65 61 72 63 68 20 63 6f 6e 73 74 72 61  A search constra
23b0: 69 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  int..*/.struct R
23c0: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 7b  treeConstraint {
23d0: 0a 20 20 69 6e 74 20 69 43 6f 6f 72 64 3b 20 20  .  int iCoord;  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2400: 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6f 72 64  onstrained coord
2410: 69 6e 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6f  inate */.  int o
2420: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2440: 6e 73 74 72 61 69 6e 69 6e 67 20 6f 70 65 72 61  nstraining opera
2450: 74 69 6f 6e 20 2a 2f 0a 20 20 52 74 72 65 65 44  tion */.  RtreeD
2460: 56 61 6c 75 65 20 72 56 61 6c 75 65 3b 20 20 20  Value rValue;   
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2480: 73 74 72 61 69 6e 74 20 76 61 6c 75 65 2e 20 2a  straint value. *
2490: 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29  /.  int (*xGeom)
24a0: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67  (sqlite3_rtree_g
24b0: 65 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52  eometry*, int, R
24c0: 74 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74  treeDValue*, int
24d0: 2a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74  *);.  sqlite3_rt
24e0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47  ree_geometry *pG
24f0: 65 6f 6d 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61  eom;  /* Constra
2500: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  int callback arg
2510: 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54 43  ument for a MATC
2520: 48 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 6f 73 73  H */.};../* Poss
2530: 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
2540: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 2e  RtreeConstraint.
2550: 6f 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 54  op */.#define RT
2560: 52 45 45 5f 45 51 20 20 20 20 30 78 34 31 0a 23  REE_EQ    0x41.#
2570: 64 65 66 69 6e 65 20 52 54 52 45 45 5f 4c 45 20  define RTREE_LE 
2580: 20 20 20 30 78 34 32 0a 23 64 65 66 69 6e 65 20     0x42.#define 
2590: 52 54 52 45 45 5f 4c 54 20 20 20 20 30 78 34 33  RTREE_LT    0x43
25a0: 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45 5f 47  .#define RTREE_G
25b0: 45 20 20 20 20 30 78 34 34 0a 23 64 65 66 69 6e  E    0x44.#defin
25c0: 65 20 52 54 52 45 45 5f 47 54 20 20 20 20 30 78  e RTREE_GT    0x
25d0: 34 35 0a 23 64 65 66 69 6e 65 20 52 54 52 45 45  45.#define RTREE
25e0: 5f 4d 41 54 43 48 20 30 78 34 36 0a 0a 2f 2a 20  _MATCH 0x46../* 
25f0: 0a 2a 2a 20 41 6e 20 72 74 72 65 65 20 73 74 72  .** An rtree str
2600: 75 63 74 75 72 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  ucture node..*/.
2610: 73 74 72 75 63 74 20 52 74 72 65 65 4e 6f 64 65  struct RtreeNode
2620: 20 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a   {.  RtreeNode *
2630: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
2640: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
2650: 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   node */.  i64 i
2660: 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 52 65 66  Node;.  int nRef
2670: 3b 0a 20 20 69 6e 74 20 69 73 44 69 72 74 79 3b  ;.  int isDirty;
2680: 0a 20 20 75 38 20 2a 7a 44 61 74 61 3b 0a 20 20  .  u8 *zData;.  
2690: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 65 78 74  RtreeNode *pNext
26a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b0: 20 20 2f 2a 20 4e 65 78 74 20 6e 6f 64 65 20 69    /* Next node i
26c0: 6e 20 74 68 69 73 20 68 61 73 68 20 63 68 61 69  n this hash chai
26d0: 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  n */.};.#define 
26e0: 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 20 72 65 61  NCELL(pNode) rea
26f0: 64 49 6e 74 31 36 28 26 28 70 4e 6f 64 65 29 2d  dInt16(&(pNode)-
2700: 3e 7a 44 61 74 61 5b 32 5d 29 0a 0a 2f 2a 20 0a  >zData[2])../* .
2710: 2a 2a 20 53 74 72 75 63 74 75 72 65 20 74 6f 20  ** Structure to 
2720: 73 74 6f 72 65 20 61 20 64 65 73 65 72 69 61 6c  store a deserial
2730: 69 7a 65 64 20 72 74 72 65 65 20 72 65 63 6f 72  ized rtree recor
2740: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72  d..*/.struct Rtr
2750: 65 65 43 65 6c 6c 20 7b 0a 20 20 69 36 34 20 69  eeCell {.  i64 i
2760: 52 6f 77 69 64 3b 0a 20 20 52 74 72 65 65 43 6f  Rowid;.  RtreeCo
2770: 6f 72 64 20 61 43 6f 6f 72 64 5b 52 54 52 45 45  ord aCoord[RTREE
2780: 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a  _MAX_DIMENSIONS*
2790: 32 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 56  2];.};.../*.** V
27a0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
27b0: 73 74 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  st field of ever
27c0: 79 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20  y RtreeMatchArg 
27d0: 6f 62 6a 65 63 74 2e 20 54 68 65 20 4d 41 54 43  object. The MATC
27e0: 48 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 74 65  H.** operator te
27f0: 73 74 73 20 74 68 61 74 20 74 68 65 20 66 69 72  sts that the fir
2800: 73 74 20 66 69 65 6c 64 20 6f 66 20 61 20 62 6c  st field of a bl
2810: 6f 62 20 6f 70 65 72 61 6e 64 20 6d 61 74 63 68  ob operand match
2820: 65 73 20 74 68 69 73 0a 2a 2a 20 76 61 6c 75 65  es this.** value
2830: 20 74 6f 20 61 76 6f 69 64 20 6f 70 65 72 61 74   to avoid operat
2840: 69 6e 67 20 6f 6e 20 69 6e 76 61 6c 69 64 20 62  ing on invalid b
2850: 6c 6f 62 73 20 28 77 68 69 63 68 20 63 6f 75 6c  lobs (which coul
2860: 64 20 63 61 75 73 65 20 61 20 73 65 67 66 61 75  d cause a segfau
2870: 6c 74 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lt)..*/.#define 
2880: 52 54 52 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d  RTREE_GEOMETRY_M
2890: 41 47 49 43 20 30 78 38 39 31 32 34 35 41 42 0a  AGIC 0x891245AB.
28a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
28b0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
28c0: 74 75 72 65 20 6d 75 73 74 20 62 65 20 73 75 70  ture must be sup
28d0: 70 6c 69 65 64 20 61 73 20 61 20 62 6c 6f 62 20  plied as a blob 
28e0: 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74  argument to.** t
28f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69  he right-hand-si
2900: 64 65 20 6f 66 20 61 6e 20 53 51 4c 20 4d 41 54  de of an SQL MAT
2910: 43 48 20 6f 70 65 72 61 74 6f 72 20 75 73 65 64  CH operator used
2920: 20 74 6f 20 63 6f 6e 73 74 72 61 69 6e 20 61 6e   to constrain an
2930: 0a 2a 2a 20 72 2d 74 72 65 65 20 71 75 65 72 79  .** r-tree query
2940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74 72 65  ..*/.struct Rtre
2950: 65 4d 61 74 63 68 41 72 67 20 7b 0a 20 20 75 33  eMatchArg {.  u3
2960: 32 20 6d 61 67 69 63 3b 20 20 20 20 20 20 20 20  2 magic;        
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2980: 20 41 6c 77 61 79 73 20 52 54 52 45 45 5f 47 45   Always RTREE_GE
2990: 4f 4d 45 54 52 59 5f 4d 41 47 49 43 20 2a 2f 0a  OMETRY_MAGIC */.
29a0: 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73    int (*xGeom)(s
29b0: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f  qlite3_rtree_geo
29c0: 6d 65 74 72 79 20 2a 2c 20 69 6e 74 2c 20 52 74  metry *, int, Rt
29d0: 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74 20  reeDValue*, int 
29e0: 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *);.  void *pCon
29f0: 74 65 78 74 3b 0a 20 20 69 6e 74 20 6e 50 61 72  text;.  int nPar
2a00: 61 6d 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  am;.  RtreeDValu
2a10: 65 20 61 50 61 72 61 6d 5b 31 5d 3b 0a 7d 3b 0a  e aParam[1];.};.
2a20: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 67 65  ./*.** When a ge
2a30: 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 20  ometry callback 
2a40: 69 73 20 63 72 65 61 74 65 64 20 28 73 65 65 20  is created (see 
2a50: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
2a60: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 29  ometry_callback)
2a70: 2c 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 6e  ,.** a single in
2a80: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2a90: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2aa0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  e is allocated. 
2ab0: 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 61 73  It is used.** as
2ac0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 66 6f 72   the context for
2ad0: 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69   the user-functi
2ae0: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 62 79  on created by by
2af0: 20 73 5f 72 5f 67 5f 63 28 29 2e 20 54 68 65 20   s_r_g_c(). The 
2b00: 6f 62 6a 65 63 74 0a 2a 2a 20 69 73 20 65 76 65  object.** is eve
2b10: 6e 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  ntually deleted 
2b20: 62 79 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  by the destructo
2b30: 72 20 6d 65 63 68 61 6e 69 73 6d 20 70 72 6f 76  r mechanism prov
2b40: 69 64 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74  ided by.** sqlit
2b50: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2b60: 6f 6e 5f 76 32 28 29 20 28 77 68 69 63 68 20 69  on_v2() (which i
2b70: 73 20 63 61 6c 6c 65 64 20 62 79 20 73 5f 72 5f  s called by s_r_
2b80: 67 5f 63 28 29 20 74 6f 20 63 72 65 61 74 65 0a  g_c() to create.
2b90: 2a 2a 20 74 68 65 20 67 65 6f 6d 65 74 72 79 20  ** the geometry 
2ba0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
2bb0: 6e 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 74  n)..*/.struct Rt
2bc0: 72 65 65 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20  reeGeomCallback 
2bd0: 7b 0a 20 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29  {.  int (*xGeom)
2be0: 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67  (sqlite3_rtree_g
2bf0: 65 6f 6d 65 74 72 79 2a 2c 20 69 6e 74 2c 20 52  eometry*, int, R
2c00: 74 72 65 65 44 56 61 6c 75 65 2a 2c 20 69 6e 74  treeDValue*, int
2c10: 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *);.  void *pCon
2c20: 74 65 78 74 3b 0a 7d 3b 0a 0a 23 69 66 6e 64 65  text;.};..#ifnde
2c30: 66 20 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 4d  f MAX.# define M
2c40: 41 58 28 78 2c 79 29 20 28 28 78 29 20 3c 20 28  AX(x,y) ((x) < (
2c50: 79 29 20 3f 20 28 79 29 20 3a 20 28 78 29 29 0a  y) ? (y) : (x)).
2c60: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4d  #endif.#ifndef M
2c70: 49 4e 0a 23 20 64 65 66 69 6e 65 20 4d 49 4e 28  IN.# define MIN(
2c80: 78 2c 79 29 20 28 28 78 29 20 3e 20 28 79 29 20  x,y) ((x) > (y) 
2c90: 3f 20 28 79 29 20 3a 20 28 78 29 29 0a 23 65 6e  ? (y) : (x)).#en
2ca0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  dif../*.** Funct
2cb0: 69 6f 6e 73 20 74 6f 20 64 65 73 65 72 69 61 6c  ions to deserial
2cc0: 69 7a 65 20 61 20 31 36 20 62 69 74 20 69 6e 74  ize a 16 bit int
2cd0: 65 67 65 72 2c 20 33 32 20 62 69 74 20 72 65 61  eger, 32 bit rea
2ce0: 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a 2a 2a 20  l number and.** 
2cf0: 36 34 20 62 69 74 20 69 6e 74 65 67 65 72 2e 20  64 bit integer. 
2d00: 54 68 65 20 64 65 73 65 72 69 61 6c 69 7a 65 64  The deserialized
2d10: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
2d20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d30: 74 20 72 65 61 64 49 6e 74 31 36 28 75 38 20 2a  t readInt16(u8 *
2d40: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
2d50: 30 5d 3c 3c 38 29 20 2b 20 70 5b 31 5d 3b 0a 7d  0]<<8) + p[1];.}
2d60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 61  .static void rea
2d70: 64 43 6f 6f 72 64 28 75 38 20 2a 70 2c 20 52 74  dCoord(u8 *p, Rt
2d80: 72 65 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64  reeCoord *pCoord
2d90: 29 7b 0a 20 20 75 33 32 20 69 20 3d 20 28 0a 20  ){.  u32 i = (. 
2da0: 20 20 20 28 28 28 75 33 32 29 70 5b 30 5d 29 20     (((u32)p[0]) 
2db0: 3c 3c 20 32 34 29 20 2b 20 0a 20 20 20 20 28 28  << 24) + .    ((
2dc0: 28 75 33 32 29 70 5b 31 5d 29 20 3c 3c 20 31 36  (u32)p[1]) << 16
2dd0: 29 20 2b 20 0a 20 20 20 20 28 28 28 75 33 32 29  ) + .    (((u32)
2de0: 70 5b 32 5d 29 20 3c 3c 20 20 38 29 20 2b 20 0a  p[2]) <<  8) + .
2df0: 20 20 20 20 28 28 28 75 33 32 29 70 5b 33 5d 29      (((u32)p[3])
2e00: 20 3c 3c 20 20 30 29 0a 20 20 29 3b 0a 20 20 2a   <<  0).  );.  *
2e10: 28 75 33 32 20 2a 29 70 43 6f 6f 72 64 20 3d 20  (u32 *)pCoord = 
2e20: 69 3b 0a 7d 0a 73 74 61 74 69 63 20 69 36 34 20  i;.}.static i64 
2e30: 72 65 61 64 49 6e 74 36 34 28 75 38 20 2a 70 29  readInt64(u8 *p)
2e40: 7b 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  {.  return (.   
2e50: 20 28 28 28 69 36 34 29 70 5b 30 5d 29 20 3c 3c   (((i64)p[0]) <<
2e60: 20 35 36 29 20 2b 20 0a 20 20 20 20 28 28 28 69   56) + .    (((i
2e70: 36 34 29 70 5b 31 5d 29 20 3c 3c 20 34 38 29 20  64)p[1]) << 48) 
2e80: 2b 20 0a 20 20 20 20 28 28 28 69 36 34 29 70 5b  + .    (((i64)p[
2e90: 32 5d 29 20 3c 3c 20 34 30 29 20 2b 20 0a 20 20  2]) << 40) + .  
2ea0: 20 20 28 28 28 69 36 34 29 70 5b 33 5d 29 20 3c    (((i64)p[3]) <
2eb0: 3c 20 33 32 29 20 2b 20 0a 20 20 20 20 28 28 28  < 32) + .    (((
2ec0: 69 36 34 29 70 5b 34 5d 29 20 3c 3c 20 32 34 29  i64)p[4]) << 24)
2ed0: 20 2b 20 0a 20 20 20 20 28 28 28 69 36 34 29 70   + .    (((i64)p
2ee0: 5b 35 5d 29 20 3c 3c 20 31 36 29 20 2b 20 0a 20  [5]) << 16) + . 
2ef0: 20 20 20 28 28 28 69 36 34 29 70 5b 36 5d 29 20     (((i64)p[6]) 
2f00: 3c 3c 20 20 38 29 20 2b 20 0a 20 20 20 20 28 28  <<  8) + .    ((
2f10: 28 69 36 34 29 70 5b 37 5d 29 20 3c 3c 20 20 30  (i64)p[7]) <<  0
2f20: 29 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ).  );.}../*.** 
2f30: 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20 73 65 72  Functions to ser
2f40: 69 61 6c 69 7a 65 20 61 20 31 36 20 62 69 74 20  ialize a 16 bit 
2f50: 69 6e 74 65 67 65 72 2c 20 33 32 20 62 69 74 20  integer, 32 bit 
2f60: 72 65 61 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a  real number and.
2f70: 2a 2a 20 36 34 20 62 69 74 20 69 6e 74 65 67 65  ** 64 bit intege
2f80: 72 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  r. The value ret
2f90: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e 75 6d  urned is the num
2fa0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
2fb0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 61  tten.** to the a
2fc0: 72 67 75 6d 65 6e 74 20 62 75 66 66 65 72 20 28  rgument buffer (
2fd0: 61 6c 77 61 79 73 20 32 2c 20 34 20 61 6e 64 20  always 2, 4 and 
2fe0: 38 20 72 65 73 70 65 63 74 69 76 65 6c 79 29 2e  8 respectively).
2ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3000: 72 69 74 65 49 6e 74 31 36 28 75 38 20 2a 70 2c  riteInt16(u8 *p,
3010: 20 69 6e 74 20 69 29 7b 0a 20 20 70 5b 30 5d 20   int i){.  p[0] 
3020: 3d 20 28 69 3e 3e 20 38 29 26 30 78 46 46 3b 0a  = (i>> 8)&0xFF;.
3030: 20 20 70 5b 31 5d 20 3d 20 28 69 3e 3e 20 30 29    p[1] = (i>> 0)
3040: 26 30 78 46 46 3b 0a 20 20 72 65 74 75 72 6e 20  &0xFF;.  return 
3050: 32 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  2;.}.static int 
3060: 77 72 69 74 65 43 6f 6f 72 64 28 75 38 20 2a 70  writeCoord(u8 *p
3070: 2c 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 70 43  , RtreeCoord *pC
3080: 6f 6f 72 64 29 7b 0a 20 20 75 33 32 20 69 3b 0a  oord){.  u32 i;.
3090: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
30a0: 28 52 74 72 65 65 43 6f 6f 72 64 29 3d 3d 34 20  (RtreeCoord)==4 
30b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
30c0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
30d0: 20 69 20 3d 20 2a 28 75 33 32 20 2a 29 70 43 6f   i = *(u32 *)pCo
30e0: 6f 72 64 3b 0a 20 20 70 5b 30 5d 20 3d 20 28 69  ord;.  p[0] = (i
30f0: 3e 3e 32 34 29 26 30 78 46 46 3b 0a 20 20 70 5b  >>24)&0xFF;.  p[
3100: 31 5d 20 3d 20 28 69 3e 3e 31 36 29 26 30 78 46  1] = (i>>16)&0xF
3110: 46 3b 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e  F;.  p[2] = (i>>
3120: 20 38 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d   8)&0xFF;.  p[3]
3130: 20 3d 20 28 69 3e 3e 20 30 29 26 30 78 46 46 3b   = (i>> 0)&0xFF;
3140: 0a 20 20 72 65 74 75 72 6e 20 34 3b 0a 7d 0a 73  .  return 4;.}.s
3150: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 49  tatic int writeI
3160: 6e 74 36 34 28 75 38 20 2a 70 2c 20 69 36 34 20  nt64(u8 *p, i64 
3170: 69 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 28 69 3e  i){.  p[0] = (i>
3180: 3e 35 36 29 26 30 78 46 46 3b 0a 20 20 70 5b 31  >56)&0xFF;.  p[1
3190: 5d 20 3d 20 28 69 3e 3e 34 38 29 26 30 78 46 46  ] = (i>>48)&0xFF
31a0: 3b 0a 20 20 70 5b 32 5d 20 3d 20 28 69 3e 3e 34  ;.  p[2] = (i>>4
31b0: 30 29 26 30 78 46 46 3b 0a 20 20 70 5b 33 5d 20  0)&0xFF;.  p[3] 
31c0: 3d 20 28 69 3e 3e 33 32 29 26 30 78 46 46 3b 0a  = (i>>32)&0xFF;.
31d0: 20 20 70 5b 34 5d 20 3d 20 28 69 3e 3e 32 34 29    p[4] = (i>>24)
31e0: 26 30 78 46 46 3b 0a 20 20 70 5b 35 5d 20 3d 20  &0xFF;.  p[5] = 
31f0: 28 69 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20  (i>>16)&0xFF;.  
3200: 70 5b 36 5d 20 3d 20 28 69 3e 3e 20 38 29 26 30  p[6] = (i>> 8)&0
3210: 78 46 46 3b 0a 20 20 70 5b 37 5d 20 3d 20 28 69  xFF;.  p[7] = (i
3220: 3e 3e 20 30 29 26 30 78 46 46 3b 0a 20 20 72 65  >> 0)&0xFF;.  re
3230: 74 75 72 6e 20 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 8;.}../*.**
3240: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
3250: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
3260: 66 20 6e 6f 64 65 20 70 2e 0a 2a 2f 0a 73 74 61  f node p..*/.sta
3270: 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 66  tic void nodeRef
3280: 65 72 65 6e 63 65 28 52 74 72 65 65 4e 6f 64 65  erence(RtreeNode
3290: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
32a0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
32b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
32c0: 61 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ar the content o
32d0: 66 20 6e 6f 64 65 20 70 20 28 73 65 74 20 61 6c  f node p (set al
32e0: 6c 20 62 79 74 65 73 20 74 6f 20 30 78 30 30 29  l bytes to 0x00)
32f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3300: 20 6e 6f 64 65 5a 65 72 6f 28 52 74 72 65 65 20   nodeZero(Rtree 
3310: 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
3320: 64 65 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  de *p){.  memset
3330: 28 26 70 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 30  (&p->zData[2], 0
3340: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
3350: 69 7a 65 2d 32 29 3b 0a 20 20 70 2d 3e 69 73 44  ize-2);.  p->isD
3360: 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  irty = 1;.}../*.
3370: 2a 2a 20 47 69 76 65 6e 20 61 20 6e 6f 64 65 20  ** Given a node 
3380: 6e 75 6d 62 65 72 20 69 4e 6f 64 65 2c 20 72 65  number iNode, re
3390: 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 73 70  turn the corresp
33a0: 6f 6e 64 69 6e 67 20 6b 65 79 20 74 6f 20 75 73  onding key to us
33b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52 74 72 65  e.** in the Rtre
33c0: 65 2e 61 48 61 73 68 20 74 61 62 6c 65 2e 0a 2a  e.aHash table..*
33d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64  /.static int nod
33e0: 65 48 61 73 68 28 69 36 34 20 69 4e 6f 64 65 29  eHash(i64 iNode)
33f0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  {.  return (.   
3400: 20 28 69 4e 6f 64 65 3e 3e 35 36 29 20 5e 20 28   (iNode>>56) ^ (
3410: 69 4e 6f 64 65 3e 3e 34 38 29 20 5e 20 28 69 4e  iNode>>48) ^ (iN
3420: 6f 64 65 3e 3e 34 30 29 20 5e 20 28 69 4e 6f 64  ode>>40) ^ (iNod
3430: 65 3e 3e 33 32 29 20 5e 20 0a 20 20 20 20 28 69  e>>32) ^ .    (i
3440: 4e 6f 64 65 3e 3e 32 34 29 20 5e 20 28 69 4e 6f  Node>>24) ^ (iNo
3450: 64 65 3e 3e 31 36 29 20 5e 20 28 69 4e 6f 64 65  de>>16) ^ (iNode
3460: 3e 3e 20 38 29 20 5e 20 28 69 4e 6f 64 65 3e 3e  >> 8) ^ (iNode>>
3470: 20 30 29 0a 20 20 29 20 25 20 48 41 53 48 53 49   0).  ) % HASHSI
3480: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  ZE;.}../*.** Sea
3490: 72 63 68 20 74 68 65 20 6e 6f 64 65 20 68 61 73  rch the node has
34a0: 68 20 74 61 62 6c 65 20 66 6f 72 20 6e 6f 64 65  h table for node
34b0: 20 69 4e 6f 64 65 2e 20 49 66 20 66 6f 75 6e 64   iNode. If found
34c0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
34d0: 65 72 0a 2a 2a 20 74 6f 20 69 74 2e 20 4f 74 68  er.** to it. Oth
34e0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 30  erwise, return 0
34f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65  ..*/.static Rtre
3500: 65 4e 6f 64 65 20 2a 6e 6f 64 65 48 61 73 68 4c  eNode *nodeHashL
3510: 6f 6f 6b 75 70 28 52 74 72 65 65 20 2a 70 52 74  ookup(Rtree *pRt
3520: 72 65 65 2c 20 69 36 34 20 69 4e 6f 64 65 29 7b  ree, i64 iNode){
3530: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 3b  .  RtreeNode *p;
3540: 0a 20 20 66 6f 72 28 70 3d 70 52 74 72 65 65 2d  .  for(p=pRtree-
3550: 3e 61 48 61 73 68 5b 6e 6f 64 65 48 61 73 68 28  >aHash[nodeHash(
3560: 69 4e 6f 64 65 29 5d 3b 20 70 20 26 26 20 70 2d  iNode)]; p && p-
3570: 3e 69 4e 6f 64 65 21 3d 69 4e 6f 64 65 3b 20 70  >iNode!=iNode; p
3580: 3d 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 72 65  =p->pNext);.  re
3590: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
35a0: 20 41 64 64 20 6e 6f 64 65 20 70 4e 6f 64 65 20   Add node pNode 
35b0: 74 6f 20 74 68 65 20 6e 6f 64 65 20 68 61 73 68  to the node hash
35c0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
35d0: 63 20 76 6f 69 64 20 6e 6f 64 65 48 61 73 68 49  c void nodeHashI
35e0: 6e 73 65 72 74 28 52 74 72 65 65 20 2a 70 52 74  nsert(Rtree *pRt
35f0: 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
3600: 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 48  pNode){.  int iH
3610: 61 73 68 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ash;.  assert( p
3620: 4e 6f 64 65 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  Node->pNext==0 )
3630: 3b 0a 20 20 69 48 61 73 68 20 3d 20 6e 6f 64 65  ;.  iHash = node
3640: 48 61 73 68 28 70 4e 6f 64 65 2d 3e 69 4e 6f 64  Hash(pNode->iNod
3650: 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 70 4e 65  e);.  pNode->pNe
3660: 78 74 20 3d 20 70 52 74 72 65 65 2d 3e 61 48 61  xt = pRtree->aHa
3670: 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20 70 52 74  sh[iHash];.  pRt
3680: 72 65 65 2d 3e 61 48 61 73 68 5b 69 48 61 73 68  ree->aHash[iHash
3690: 5d 20 3d 20 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ] = pNode;.}../*
36a0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e 6f 64 65 20  .** Remove node 
36b0: 70 4e 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 6e  pNode from the n
36c0: 6f 64 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  ode hash table..
36d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
36e0: 6f 64 65 48 61 73 68 44 65 6c 65 74 65 28 52 74  odeHashDelete(Rt
36f0: 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72  ree *pRtree, Rtr
3700: 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  eeNode *pNode){.
3710: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70    RtreeNode **pp
3720: 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69  ;.  if( pNode->i
3730: 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 70  Node!=0 ){.    p
3740: 70 20 3d 20 26 70 52 74 72 65 65 2d 3e 61 48 61  p = &pRtree->aHa
3750: 73 68 5b 6e 6f 64 65 48 61 73 68 28 70 4e 6f 64  sh[nodeHash(pNod
3760: 65 2d 3e 69 4e 6f 64 65 29 5d 3b 0a 20 20 20 20  e->iNode)];.    
3770: 66 6f 72 28 20 3b 20 28 2a 70 70 29 21 3d 70 4e  for( ; (*pp)!=pN
3780: 6f 64 65 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  ode; pp = &(*pp)
3790: 2d 3e 70 4e 65 78 74 29 7b 20 61 73 73 65 72 74  ->pNext){ assert
37a0: 28 2a 70 70 29 3b 20 7d 0a 20 20 20 20 2a 70 70  (*pp); }.    *pp
37b0: 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 3b   = pNode->pNext;
37c0: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 78  .    pNode->pNex
37d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
37e0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
37f0: 20 72 65 74 75 72 6e 20 6e 65 77 20 72 2d 74 72   return new r-tr
3800: 65 65 20 6e 6f 64 65 2e 20 49 6e 69 74 69 61 6c  ee node. Initial
3810: 6c 79 2c 20 28 52 74 72 65 65 4e 6f 64 65 2e 69  ly, (RtreeNode.i
3820: 4e 6f 64 65 3d 3d 30 29 2c 0a 2a 2a 20 69 6e 64  Node==0),.** ind
3830: 69 63 61 74 69 6e 67 20 74 68 61 74 20 6e 6f 64  icating that nod
3840: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
3850: 65 6e 20 61 73 73 69 67 6e 65 64 20 61 20 6e 6f  en assigned a no
3860: 64 65 20 6e 75 6d 62 65 72 2e 20 49 74 20 69 73  de number. It is
3870: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 61 20 6e  .** assigned a n
3880: 6f 64 65 20 6e 75 6d 62 65 72 20 77 68 65 6e 20  ode number when 
3890: 6e 6f 64 65 57 72 69 74 65 28 29 20 69 73 20 63  nodeWrite() is c
38a0: 61 6c 6c 65 64 20 74 6f 20 77 72 69 74 65 20 74  alled to write t
38b0: 68 65 0a 2a 2a 20 6e 6f 64 65 20 63 6f 6e 74 65  he.** node conte
38c0: 6e 74 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  nts out to the d
38d0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
38e0: 69 63 20 52 74 72 65 65 4e 6f 64 65 20 2a 6e 6f  ic RtreeNode *no
38f0: 64 65 4e 65 77 28 52 74 72 65 65 20 2a 70 52 74  deNew(Rtree *pRt
3900: 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
3910: 70 50 61 72 65 6e 74 29 7b 0a 20 20 52 74 72 65  pParent){.  Rtre
3920: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  eNode *pNode;.  
3930: 70 4e 6f 64 65 20 3d 20 28 52 74 72 65 65 4e 6f  pNode = (RtreeNo
3940: 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
3950: 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65  loc(sizeof(Rtree
3960: 4e 6f 64 65 29 20 2b 20 70 52 74 72 65 65 2d 3e  Node) + pRtree->
3970: 69 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66  iNodeSize);.  if
3980: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6d  ( pNode ){.    m
3990: 65 6d 73 65 74 28 70 4e 6f 64 65 2c 20 30 2c 20  emset(pNode, 0, 
39a0: 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64 65  sizeof(RtreeNode
39b0: 29 20 2b 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64  ) + pRtree->iNod
39c0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 4e 6f 64  eSize);.    pNod
39d0: 65 2d 3e 7a 44 61 74 61 20 3d 20 28 75 38 20 2a  e->zData = (u8 *
39e0: 29 26 70 4e 6f 64 65 5b 31 5d 3b 0a 20 20 20 20  )&pNode[1];.    
39f0: 70 4e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  pNode->nRef = 1;
3a00: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72  .    pNode->pPar
3a10: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
3a20: 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74     pNode->isDirt
3a30: 79 20 3d 20 31 3b 0a 20 20 20 20 6e 6f 64 65 52  y = 1;.    nodeR
3a40: 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e 74  eference(pParent
3a50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3a60: 70 4e 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pNode;.}../*.** 
3a70: 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
3a80: 63 65 20 74 6f 20 61 6e 20 72 2d 74 72 65 65 20  ce to an r-tree 
3a90: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
3aa0: 69 6e 74 0a 6e 6f 64 65 41 63 71 75 69 72 65 28  int.nodeAcquire(
3ab0: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
3ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3ad0: 20 52 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   R-tree structur
3ae0: 65 20 2a 2f 0a 20 20 69 36 34 20 69 4e 6f 64 65  e */.  i64 iNode
3af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b00: 20 20 2f 2a 20 4e 6f 64 65 20 6e 75 6d 62 65 72    /* Node number
3b10: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 52 74   to load */.  Rt
3b20: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
3b30: 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74 68  ,        /* Eith
3b40: 65 72 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  er the parent no
3b50: 64 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  de or NULL */.  
3b60: 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4e 6f  RtreeNode **ppNo
3b70: 64 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  de         /* OU
3b80: 54 3a 20 41 63 71 75 69 72 65 64 20 6e 6f 64 65  T: Acquired node
3b90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
3ba0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
3bb0: 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e  ITE_OK;.  RtreeN
3bc0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 2f  ode *pNode;..  /
3bd0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  * Check if the r
3be0: 65 71 75 65 73 74 65 64 20 6e 6f 64 65 20 69 73  equested node is
3bf0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
3c00: 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 73  hash table. If s
3c10: 6f 2c 0a 20 20 2a 2a 20 69 6e 63 72 65 61 73 65  o,.  ** increase
3c20: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
3c30: 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ount and return 
3c40: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
3c50: 70 4e 6f 64 65 20 3d 20 6e 6f 64 65 48 61 73 68  pNode = nodeHash
3c60: 4c 6f 6f 6b 75 70 28 70 52 74 72 65 65 2c 20 69  Lookup(pRtree, i
3c70: 4e 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 61 73  Node)) ){.    as
3c80: 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 20 7c  sert( !pParent |
3c90: 7c 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e  | !pNode->pParen
3ca0: 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 70 50 61 72  t || pNode->pPar
3cb0: 65 6e 74 3d 3d 70 50 61 72 65 6e 74 20 29 3b 0a  ent==pParent );.
3cc0: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
3cd0: 26 26 20 21 70 4e 6f 64 65 2d 3e 70 50 61 72 65  && !pNode->pPare
3ce0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65  nt ){.      node
3cf0: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 65 6e  Reference(pParen
3d00: 74 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  t);.      pNode-
3d10: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
3d20: 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  nt;.    }.    pN
3d30: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ode->nRef++;.   
3d40: 20 2a 70 70 4e 6f 64 65 20 3d 20 70 4e 6f 64 65   *ppNode = pNode
3d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
3d60: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 73  ITE_OK;.  }..  s
3d70: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
3d80: 34 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e  4(pRtree->pReadN
3d90: 6f 64 65 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a  ode, 1, iNode);.
3da0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
3db0: 74 65 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61  tep(pRtree->pRea
3dc0: 64 4e 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63  dNode);.  if( rc
3dd0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3de0: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 42      const u8 *zB
3df0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
3e00: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 52 74 72 65 65  lumn_blob(pRtree
3e10: 2d 3e 70 52 65 61 64 4e 6f 64 65 2c 20 30 29 3b  ->pReadNode, 0);
3e20: 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d  .    if( pRtree-
3e30: 3e 69 4e 6f 64 65 53 69 7a 65 3d 3d 73 71 6c 69  >iNodeSize==sqli
3e40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
3e50: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 4e 6f  (pRtree->pReadNo
3e60: 64 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  de, 0) ){.      
3e70: 70 4e 6f 64 65 20 3d 20 28 52 74 72 65 65 4e 6f  pNode = (RtreeNo
3e80: 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
3e90: 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65  loc(sizeof(Rtree
3ea0: 4e 6f 64 65 29 2b 70 52 74 72 65 65 2d 3e 69 4e  Node)+pRtree->iN
3eb0: 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  odeSize);.      
3ec0: 69 66 28 20 21 70 4e 6f 64 65 20 29 7b 0a 20 20  if( !pNode ){.  
3ed0: 20 20 20 20 20 20 72 63 32 20 3d 20 53 51 4c 49        rc2 = SQLI
3ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
3ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3f00: 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Node->pParent = 
3f10: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  pParent;.       
3f20: 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 20 3d 20   pNode->zData = 
3f30: 28 75 38 20 2a 29 26 70 4e 6f 64 65 5b 31 5d 3b  (u8 *)&pNode[1];
3f40: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
3f50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
3f60: 20 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d    pNode->iNode =
3f70: 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20   iNode;.        
3f80: 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d  pNode->isDirty =
3f90: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64   0;.        pNod
3fa0: 65 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  e->pNext = 0;.  
3fb0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
3fc0: 64 65 2d 3e 7a 44 61 74 61 2c 20 7a 42 6c 6f 62  de->zData, zBlob
3fd0: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
3fe0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f  ize);.        no
3ff0: 64 65 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  deReference(pPar
4000: 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ent);.      }.  
4010: 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73    }.  }.  rc = s
4020: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
4030: 72 65 65 2d 3e 70 52 65 61 64 4e 6f 64 65 29 3b  ree->pReadNode);
4040: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4050: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
4060: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 6f  ..  /* If the ro
4070: 6f 74 20 6e 6f 64 65 20 77 61 73 20 6a 75 73 74  ot node was just
4080: 20 6c 6f 61 64 65 64 2c 20 73 65 74 20 70 52 74   loaded, set pRt
4090: 72 65 65 2d 3e 69 44 65 70 74 68 20 74 6f 20 74  ree->iDepth to t
40a0: 68 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 6f  he height.  ** o
40b0: 66 20 74 68 65 20 72 2d 74 72 65 65 20 73 74 72  f the r-tree str
40c0: 75 63 74 75 72 65 2e 20 41 20 68 65 69 67 68 74  ucture. A height
40d0: 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 61   of zero means a
40e0: 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65  ll data is store
40f0: 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 72 6f  d on.  ** the ro
4100: 6f 74 20 6e 6f 64 65 2e 20 41 20 68 65 69 67 68  ot node. A heigh
4110: 74 20 6f 66 20 6f 6e 65 20 6d 65 61 6e 73 20 74  t of one means t
4120: 68 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  he children of t
4130: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 0a 20 20 2a  he root node.  *
4140: 2a 20 61 72 65 20 74 68 65 20 6c 65 61 76 65 73  * are the leaves
4150: 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20  , and so on. If 
4160: 74 68 65 20 64 65 70 74 68 20 61 73 20 73 70 65  the depth as spe
4170: 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 72 6f  cified on the ro
4180: 6f 74 20 6e 6f 64 65 0a 20 20 2a 2a 20 69 73 20  ot node.  ** is 
4190: 67 72 65 61 74 65 72 20 74 68 61 6e 20 52 54 52  greater than RTR
41a0: 45 45 5f 4d 41 58 5f 44 45 50 54 48 2c 20 74 68  EE_MAX_DEPTH, th
41b0: 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
41c0: 72 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  re must be corru
41d0: 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  pt..  */.  if( p
41e0: 4e 6f 64 65 20 26 26 20 69 4e 6f 64 65 3d 3d 31  Node && iNode==1
41f0: 20 29 7b 0a 20 20 20 20 70 52 74 72 65 65 2d 3e   ){.    pRtree->
4200: 69 44 65 70 74 68 20 3d 20 72 65 61 64 49 6e 74  iDepth = readInt
4210: 31 36 28 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 29  16(pNode->zData)
4220: 3b 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65  ;.    if( pRtree
4230: 2d 3e 69 44 65 70 74 68 3e 52 54 52 45 45 5f 4d  ->iDepth>RTREE_M
4240: 41 58 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20  AX_DEPTH ){.    
4250: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
4260: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
4270: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
4280: 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
4290: 72 72 65 64 20 73 6f 20 66 61 72 2c 20 63 68 65  rred so far, che
42a0: 63 6b 20 69 66 20 74 68 65 20 22 6e 75 6d 62 65  ck if the "numbe
42b0: 72 20 6f 66 20 65 6e 74 72 69 65 73 22 0a 20 20  r of entries".  
42c0: 2a 2a 20 66 69 65 6c 64 20 6f 6e 20 74 68 65 20  ** field on the 
42d0: 6e 6f 64 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  node is too larg
42e0: 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
42f0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
4300: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   .  ** SQLITE_CO
4310: 52 52 55 50 54 5f 56 54 41 42 2e 0a 20 20 2a 2f  RRUPT_VTAB..  */
4320: 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20  .  if( pNode && 
4330: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4340: 0a 20 20 20 20 69 66 28 20 4e 43 45 4c 4c 28 70  .    if( NCELL(p
4350: 4e 6f 64 65 29 3e 28 28 70 52 74 72 65 65 2d 3e  Node)>((pRtree->
4360: 69 4e 6f 64 65 53 69 7a 65 2d 34 29 2f 70 52 74  iNodeSize-4)/pRt
4370: 72 65 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65  ree->nBytesPerCe
4380: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ll) ){.      rc 
4390: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
43a0: 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _VTAB;.    }.  }
43b0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
43c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
43d0: 20 70 4e 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20   pNode!=0 ){.   
43e0: 20 20 20 6e 6f 64 65 48 61 73 68 49 6e 73 65 72     nodeHashInser
43f0: 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 29  t(pRtree, pNode)
4400: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4410: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
4420: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
4430: 20 7d 0a 20 20 20 20 2a 70 70 4e 6f 64 65 20 3d   }.    *ppNode =
4440: 20 70 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b   pNode;.  }else{
4450: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4460: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 2a 70  e(pNode);.    *p
4470: 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNode = 0;.  }..
4480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4490: 2f 2a 0a 2a 2a 20 4f 76 65 72 77 72 69 74 65 20  /*.** Overwrite 
44a0: 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e 6f  cell iCell of no
44b0: 64 65 20 70 4e 6f 64 65 20 77 69 74 68 20 74 68  de pNode with th
44c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 43  e contents of pC
44d0: 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
44e0: 6f 69 64 20 6e 6f 64 65 4f 76 65 72 77 72 69 74  oid nodeOverwrit
44f0: 65 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  eCell(.  Rtree *
4500: 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65  pRtree, .  Rtree
4510: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 0a 20  Node *pNode,  . 
4520: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
4530: 6c 2c 20 0a 20 20 69 6e 74 20 69 43 65 6c 6c 0a  l, .  int iCell.
4540: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 75  ){.  int ii;.  u
4550: 38 20 2a 70 20 3d 20 26 70 4e 6f 64 65 2d 3e 7a  8 *p = &pNode->z
4560: 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65 65 2d  Data[4 + pRtree-
4570: 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 69  >nBytesPerCell*i
4580: 43 65 6c 6c 5d 3b 0a 20 20 70 20 2b 3d 20 77 72  Cell];.  p += wr
4590: 69 74 65 49 6e 74 36 34 28 70 2c 20 70 43 65 6c  iteInt64(p, pCel
45a0: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 66 6f  l->iRowid);.  fo
45b0: 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74 72  r(ii=0; ii<(pRtr
45c0: 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b  ee->nDim*2); ii+
45d0: 2b 29 7b 0a 20 20 20 20 70 20 2b 3d 20 77 72 69  +){.    p += wri
45e0: 74 65 43 6f 6f 72 64 28 70 2c 20 26 70 43 65 6c  teCoord(p, &pCel
45f0: 6c 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 29 3b 0a  l->aCoord[ii]);.
4600: 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 73 44    }.  pNode->isD
4610: 69 72 74 79 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  irty = 1;.}../*.
4620: 2a 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 20 74  ** Remove cell t
4630: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4640: 65 78 20 69 43 65 6c 6c 20 66 72 6f 6d 20 6e 6f  ex iCell from no
4650: 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  de pNode..*/.sta
4660: 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 44 65 6c  tic void nodeDel
4670: 65 74 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70  eteCell(Rtree *p
4680: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
4690: 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65   *pNode, int iCe
46a0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 44 73 74 20  ll){.  u8 *pDst 
46b0: 3d 20 26 70 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b  = &pNode->zData[
46c0: 34 20 2b 20 70 52 74 72 65 65 2d 3e 6e 42 79 74  4 + pRtree->nByt
46d0: 65 73 50 65 72 43 65 6c 6c 2a 69 43 65 6c 6c 5d  esPerCell*iCell]
46e0: 3b 0a 20 20 75 38 20 2a 70 53 72 63 20 3d 20 26  ;.  u8 *pSrc = &
46f0: 70 44 73 74 5b 70 52 74 72 65 65 2d 3e 6e 42 79  pDst[pRtree->nBy
4700: 74 65 73 50 65 72 43 65 6c 6c 5d 3b 0a 20 20 69  tesPerCell];.  i
4710: 6e 74 20 6e 42 79 74 65 20 3d 20 28 4e 43 45 4c  nt nByte = (NCEL
4720: 4c 28 70 4e 6f 64 65 29 20 2d 20 69 43 65 6c 6c  L(pNode) - iCell
4730: 20 2d 20 31 29 20 2a 20 70 52 74 72 65 65 2d 3e   - 1) * pRtree->
4740: 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20  nBytesPerCell;. 
4750: 20 6d 65 6d 6d 6f 76 65 28 70 44 73 74 2c 20 70   memmove(pDst, p
4760: 53 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 77  Src, nByte);.  w
4770: 72 69 74 65 49 6e 74 31 36 28 26 70 4e 6f 64 65  riteInt16(&pNode
4780: 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20 4e 43 45 4c  ->zData[2], NCEL
4790: 4c 28 70 4e 6f 64 65 29 2d 31 29 3b 0a 20 20 70  L(pNode)-1);.  p
47a0: 4e 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20  Node->isDirty = 
47b0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  1;.}../*.** Inse
47c0: 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rt the contents 
47d0: 6f 66 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 6e  of cell pCell in
47e0: 74 6f 20 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49  to node pNode. I
47f0: 66 20 74 68 65 20 69 6e 73 65 72 74 0a 2a 2a 20  f the insert.** 
4800: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  is successful, r
4810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
4820: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4830: 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72  is not enough fr
4840: 65 65 20 73 70 61 63 65 20 69 6e 20 70 4e 6f 64  ee space in pNod
4850: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
4860: 5f 46 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  _FULL..*/.static
4870: 20 69 6e 74 0a 6e 6f 64 65 49 6e 73 65 72 74 43   int.nodeInsertC
4880: 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a 70 52  ell(.  Rtree *pR
4890: 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 4e 6f  tree, .  RtreeNo
48a0: 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20 52 74  de *pNode, .  Rt
48b0: 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 0a  reeCell *pCell .
48c0: 29 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  ){.  int nCell; 
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
48f0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
4900: 20 70 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   pNode */.  int 
4910: 6e 4d 61 78 43 65 6c 6c 3b 20 20 20 20 20 20 20  nMaxCell;       
4920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
4930: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
4940: 65 6c 6c 73 20 66 6f 72 20 70 4e 6f 64 65 20 2a  ells for pNode *
4950: 2f 0a 0a 20 20 6e 4d 61 78 43 65 6c 6c 20 3d 20  /..  nMaxCell = 
4960: 28 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69  (pRtree->iNodeSi
4970: 7a 65 2d 34 29 2f 70 52 74 72 65 65 2d 3e 6e 42  ze-4)/pRtree->nB
4980: 79 74 65 73 50 65 72 43 65 6c 6c 3b 0a 20 20 6e  ytesPerCell;.  n
4990: 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f  Cell = NCELL(pNo
49a0: 64 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  de);..  assert( 
49b0: 6e 43 65 6c 6c 3c 3d 6e 4d 61 78 43 65 6c 6c 20  nCell<=nMaxCell 
49c0: 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 3c 6e  );.  if( nCell<n
49d0: 4d 61 78 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  MaxCell ){.    n
49e0: 6f 64 65 4f 76 65 72 77 72 69 74 65 43 65 6c 6c  odeOverwriteCell
49f0: 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
4a00: 70 43 65 6c 6c 2c 20 6e 43 65 6c 6c 29 3b 0a 20  pCell, nCell);. 
4a10: 20 20 20 77 72 69 74 65 49 6e 74 31 36 28 26 70     writeInt16(&p
4a20: 4e 6f 64 65 2d 3e 7a 44 61 74 61 5b 32 5d 2c 20  Node->zData[2], 
4a30: 6e 43 65 6c 6c 2b 31 29 3b 0a 20 20 20 20 70 4e  nCell+1);.    pN
4a40: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 31  ode->isDirty = 1
4a50: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4a60: 28 6e 43 65 6c 6c 3d 3d 6e 4d 61 78 43 65 6c 6c  (nCell==nMaxCell
4a70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
4a80: 68 65 20 6e 6f 64 65 20 69 73 20 64 69 72 74 79  he node is dirty
4a90: 2c 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  , write it out t
4aa0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
4ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 6e 6f  */.static int.no
4ac0: 64 65 57 72 69 74 65 28 52 74 72 65 65 20 2a 70  deWrite(Rtree *p
4ad0: 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65  Rtree, RtreeNode
4ae0: 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20   *pNode){.  int 
4af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4b00: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 73 44    if( pNode->isD
4b10: 69 72 74 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  irty ){.    sqli
4b20: 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70 52  te3_stmt *p = pR
4b30: 74 72 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65  tree->pWriteNode
4b40: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ;.    if( pNode-
4b50: 3e 69 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  >iNode ){.      
4b60: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
4b70: 36 34 28 70 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e  64(p, 1, pNode->
4b80: 69 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 65 6c 73  iNode);.    }els
4b90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4ba0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2c 20 31 29  _bind_null(p, 1)
4bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4bc0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2c  te3_bind_blob(p,
4bd0: 20 32 2c 20 70 4e 6f 64 65 2d 3e 7a 44 61 74 61   2, pNode->zData
4be0: 2c 20 70 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53  , pRtree->iNodeS
4bf0: 69 7a 65 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ize, SQLITE_STAT
4c00: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
4c10: 5f 73 74 65 70 28 70 29 3b 0a 20 20 20 20 70 4e  _step(p);.    pN
4c20: 6f 64 65 2d 3e 69 73 44 69 72 74 79 20 3d 20 30  ode->isDirty = 0
4c30: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
4c40: 65 33 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  e3_reset(p);.   
4c50: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64   if( pNode->iNod
4c60: 65 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  e==0 && rc==SQLI
4c70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4c80: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 20 3d 20 73 71  Node->iNode = sq
4c90: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
4ca0: 74 5f 72 6f 77 69 64 28 70 52 74 72 65 65 2d 3e  t_rowid(pRtree->
4cb0: 64 62 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65 48  db);.      nodeH
4cc0: 61 73 68 49 6e 73 65 72 74 28 70 52 74 72 65 65  ashInsert(pRtree
4cd0: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  , pNode);.    }.
4ce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
4d00: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
4d10: 20 61 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20   a node. If the 
4d20: 6e 6f 64 65 20 69 73 20 64 69 72 74 79 20 61 6e  node is dirty an
4d30: 64 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 0a  d the reference.
4d40: 2a 2a 20 63 6f 75 6e 74 20 64 72 6f 70 73 20 74  ** count drops t
4d50: 6f 20 7a 65 72 6f 2c 20 74 68 65 20 6e 6f 64 65  o zero, the node
4d60: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
4d70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  ..*/.static int.
4d90: 6e 6f 64 65 52 65 6c 65 61 73 65 28 52 74 72 65  nodeRelease(Rtre
4da0: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
4db0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
4dc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4dd0: 4f 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 20  OK;.  if( pNode 
4de0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4df0: 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
4e00: 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2d      pNode->nRef-
4e10: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  -;.    if( pNode
4e20: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
4e30: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 69 4e     if( pNode->iN
4e40: 6f 64 65 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ode==1 ){.      
4e50: 20 20 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68    pRtree->iDepth
4e60: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
4e70: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e       if( pNode->
4e80: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
4e90: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 6c 65     rc = nodeRele
4ea0: 61 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ase(pRtree, pNod
4eb0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
4ec0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
4ed0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4ee0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64          rc = nod
4ef0: 65 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  eWrite(pRtree, p
4f00: 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Node);.      }. 
4f10: 20 20 20 20 20 6e 6f 64 65 48 61 73 68 44 65 6c       nodeHashDel
4f20: 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ete(pRtree, pNod
4f30: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4f40: 33 5f 66 72 65 65 28 70 4e 6f 64 65 29 3b 0a 20  3_free(pNode);. 
4f50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4f60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
4f70: 65 74 75 72 6e 20 74 68 65 20 36 34 2d 62 69 74  eturn the 64-bit
4f80: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 61   integer value a
4f90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
4fa0: 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 0a 2a 2a 20  ell iCell of.** 
4fb0: 6e 6f 64 65 20 70 4e 6f 64 65 2e 20 49 66 20 70  node pNode. If p
4fc0: 4e 6f 64 65 20 69 73 20 61 20 6c 65 61 66 20 6e  Node is a leaf n
4fd0: 6f 64 65 2c 20 74 68 69 73 20 69 73 20 61 20 72  ode, this is a r
4fe0: 6f 77 69 64 2e 20 49 66 20 69 74 20 69 73 0a 2a  owid. If it is.*
4ff0: 2a 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  * an internal no
5000: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 36 34 2d  de, then the 64-
5010: 62 69 74 20 69 6e 74 65 67 65 72 20 69 73 20 61  bit integer is a
5020: 20 63 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   child page numb
5030: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  er..*/.static i6
5040: 34 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 0a  4 nodeGetRowid(.
5050: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
5060: 20 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70   .  RtreeNode *p
5070: 4e 6f 64 65 2c 20 0a 20 20 69 6e 74 20 69 43 65  Node, .  int iCe
5080: 6c 6c 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ll.){.  assert( 
5090: 69 43 65 6c 6c 3c 4e 43 45 4c 4c 28 70 4e 6f 64  iCell<NCELL(pNod
50a0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
50b0: 65 61 64 49 6e 74 36 34 28 26 70 4e 6f 64 65 2d  eadInt64(&pNode-
50c0: 3e 7a 44 61 74 61 5b 34 20 2b 20 70 52 74 72 65  >zData[4 + pRtre
50d0: 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
50e0: 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  *iCell]);.}../*.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6f 72 64 69  ** Return coordi
5100: 6e 61 74 65 20 69 43 6f 6f 72 64 20 66 72 6f 6d  nate iCoord from
5110: 20 63 65 6c 6c 20 69 43 65 6c 6c 20 69 6e 20 6e   cell iCell in n
5120: 6f 64 65 20 70 4e 6f 64 65 2e 0a 2a 2f 0a 73 74  ode pNode..*/.st
5130: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 47 65  atic void nodeGe
5140: 74 43 6f 6f 72 64 28 0a 20 20 52 74 72 65 65 20  tCoord(.  Rtree 
5150: 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65  *pRtree, .  Rtre
5160: 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20  eNode *pNode, . 
5170: 20 69 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 69 6e   int iCell,.  in
5180: 74 20 69 43 6f 6f 72 64 2c 0a 20 20 52 74 72 65  t iCoord,.  Rtre
5190: 65 43 6f 6f 72 64 20 2a 70 43 6f 6f 72 64 20 20  eCoord *pCoord  
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
51b0: 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
51c0: 74 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 72 65 61  t to */.){.  rea
51d0: 64 43 6f 6f 72 64 28 26 70 4e 6f 64 65 2d 3e 7a  dCoord(&pNode->z
51e0: 44 61 74 61 5b 31 32 20 2b 20 70 52 74 72 65 65  Data[12 + pRtree
51f0: 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c 2a  ->nBytesPerCell*
5200: 69 43 65 6c 6c 20 2b 20 34 2a 69 43 6f 6f 72 64  iCell + 4*iCoord
5210: 5d 2c 20 70 43 6f 6f 72 64 29 3b 0a 7d 0a 0a 2f  ], pCoord);.}../
5220: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
5230: 20 63 65 6c 6c 20 69 43 65 6c 6c 20 6f 66 20 6e   cell iCell of n
5240: 6f 64 65 20 70 4e 6f 64 65 2e 20 50 6f 70 75 6c  ode pNode. Popul
5250: 61 74 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ate the structur
5260: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5270: 62 79 20 70 43 65 6c 6c 20 77 69 74 68 20 74 68  by pCell with th
5280: 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  e results..*/.st
5290: 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 47 65  atic void nodeGe
52a0: 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
52b0: 70 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65  pRtree, .  Rtree
52c0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a 20 20  Node *pNode, .  
52d0: 69 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 52 74 72  int iCell,.  Rtr
52e0: 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 0a 29 7b  eeCell *pCell.){
52f0: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 70 43 65  .  int ii;.  pCe
5300: 6c 6c 2d 3e 69 52 6f 77 69 64 20 3d 20 6e 6f 64  ll->iRowid = nod
5310: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
5320: 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29 3b  , pNode, iCell);
5330: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
5340: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 3b 20  pRtree->nDim*2; 
5350: 69 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 64 65 47  ii++){.    nodeG
5360: 65 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20  etCoord(pRtree, 
5370: 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 2c 20 69 69  pNode, iCell, ii
5380: 2c 20 26 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64  , &pCell->aCoord
5390: 5b 69 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  [ii]);.  }.}.../
53a0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
53b0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 75  ation for the fu
53c0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  nction that does
53d0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20   the work of.** 
53e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
53f0: 65 20 6d 6f 64 75 6c 65 20 78 43 72 65 61 74 65  e module xCreate
5400: 28 29 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 28  () and xConnect(
5410: 29 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  ) methods..*/.st
5420: 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e  atic int rtreeIn
5430: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 2c  it(.  sqlite3 *,
5440: 20 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f   void *, int, co
5450: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
5460: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
5470: 2a 2c 20 63 68 61 72 20 2a 2a 2c 20 69 6e 74 0a  *, char **, int.
5480: 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65  );../* .** Rtree
5490: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
54a0: 6f 64 75 6c 65 20 78 43 72 65 61 74 65 20 6d 65  odule xCreate me
54b0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
54c0: 69 6e 74 20 72 74 72 65 65 43 72 65 61 74 65 28  int rtreeCreate(
54d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
54e0: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
54f0: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
5500: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
5510: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
5520: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
5530: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
5540: 65 74 75 72 6e 20 72 74 72 65 65 49 6e 69 74 28  eturn rtreeInit(
5550: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
5560: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
5570: 45 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a  Err, 1);.}../* .
5580: 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c  ** Rtree virtual
5590: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
55a0: 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
55b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
55c0: 65 65 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  eeConnect(.  sql
55d0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
55e0: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
55f0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
5600: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
5610: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
5620: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
5630: 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Err.){.  return 
5640: 72 74 72 65 65 49 6e 69 74 28 64 62 2c 20 70 41  rtreeInit(db, pA
5650: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
5660: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20 30  ppVtab, pzErr, 0
5670: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
5680: 65 6d 65 6e 74 20 74 68 65 20 72 2d 74 72 65 65  ement the r-tree
5690: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
56a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
56b0: 20 72 74 72 65 65 52 65 66 65 72 65 6e 63 65 28   rtreeReference(
56c0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b 0a  Rtree *pRtree){.
56d0: 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 2b    pRtree->nBusy+
56e0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  +;.}../*.** Decr
56f0: 65 6d 65 6e 74 20 74 68 65 20 72 2d 74 72 65 65  ement the r-tree
5700: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5710: 2e 20 57 68 65 6e 20 74 68 65 20 72 65 66 65 72  . When the refer
5720: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
5730: 65 73 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 73  es.** zero the s
5740: 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
5750: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
5760: 6f 69 64 20 72 74 72 65 65 52 65 6c 65 61 73 65  oid rtreeRelease
5770: 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b  (Rtree *pRtree){
5780: 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79  .  pRtree->nBusy
5790: 2d 2d 3b 0a 20 20 69 66 28 20 70 52 74 72 65 65  --;.  if( pRtree
57a0: 2d 3e 6e 42 75 73 79 3d 3d 30 20 29 7b 0a 20 20  ->nBusy==0 ){.  
57b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
57c0: 7a 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64  ze(pRtree->pRead
57d0: 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Node);.    sqlit
57e0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72  e3_finalize(pRtr
57f0: 65 65 2d 3e 70 57 72 69 74 65 4e 6f 64 65 29 3b  ee->pWriteNode);
5800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5810: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44  alize(pRtree->pD
5820: 65 6c 65 74 65 4e 6f 64 65 29 3b 0a 20 20 20 20  eleteNode);.    
5830: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
5840: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
5850: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
5860: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65  3_finalize(pRtre
5870: 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 29 3b  e->pWriteRowid);
5880: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
5890: 61 6c 69 7a 65 28 70 52 74 72 65 65 2d 3e 70 44  alize(pRtree->pD
58a0: 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 20  eleteRowid);.   
58b0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
58c0: 65 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 50  e(pRtree->pReadP
58d0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
58e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 52 74  te3_finalize(pRt
58f0: 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e  ree->pWriteParen
5900: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
5910: 66 69 6e 61 6c 69 7a 65 28 70 52 74 72 65 65 2d  finalize(pRtree-
5920: 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 29 3b  >pDeleteParent);
5930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5940: 65 28 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 7d  e(pRtree);.  }.}
5950: 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76  ../* .** Rtree v
5960: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5970: 75 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  ule xDisconnect 
5980: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
5990: 63 20 69 6e 74 20 72 74 72 65 65 44 69 73 63 6f  c int rtreeDisco
59a0: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
59b0: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 74  ab *pVtab){.  rt
59c0: 72 65 65 52 65 6c 65 61 73 65 28 28 52 74 72 65  reeRelease((Rtre
59d0: 65 20 2a 29 70 56 74 61 62 29 3b 0a 20 20 72 65  e *)pVtab);.  re
59e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
59f0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
5a00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
5a10: 64 75 6c 65 20 78 44 65 73 74 72 6f 79 20 6d 65  dule xDestroy me
5a20: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
5a30: 69 6e 74 20 72 74 72 65 65 44 65 73 74 72 6f 79  int rtreeDestroy
5a40: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
5a50: 56 74 61 62 29 7b 0a 20 20 52 74 72 65 65 20 2a  Vtab){.  Rtree *
5a60: 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65 20  pRtree = (Rtree 
5a70: 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVtab;.  int r
5a80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 72 65 61  c;.  char *zCrea
5a90: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
5aa0: 69 6e 74 66 28 0a 20 20 20 20 22 44 52 4f 50 20  intf(.    "DROP 
5ab0: 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f 6e  TABLE '%q'.'%q_n
5ac0: 6f 64 65 27 3b 22 0a 20 20 20 20 22 44 52 4f 50  ode';".    "DROP
5ad0: 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25 71 5f   TABLE '%q'.'%q_
5ae0: 72 6f 77 69 64 27 3b 22 0a 20 20 20 20 22 44 52  rowid';".    "DR
5af0: 4f 50 20 54 41 42 4c 45 20 27 25 71 27 2e 27 25  OP TABLE '%q'.'%
5b00: 71 5f 70 61 72 65 6e 74 27 3b 22 2c 0a 20 20 20  q_parent';",.   
5b10: 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52   pRtree->zDb, pR
5b20: 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  tree->zName, .  
5b30: 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70    pRtree->zDb, p
5b40: 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Rtree->zName,.  
5b50: 20 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70    pRtree->zDb, p
5b60: 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 0a 20 20 29  Rtree->zName.  )
5b70: 3b 0a 20 20 69 66 28 20 21 7a 43 72 65 61 74 65  ;.  if( !zCreate
5b80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
5b90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
5ba0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
5bb0: 69 74 65 33 5f 65 78 65 63 28 70 52 74 72 65 65  ite3_exec(pRtree
5bc0: 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
5bd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5be0: 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
5bf0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
5c00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5c10: 20 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28     rtreeRelease(
5c20: 70 52 74 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20  pRtree);.  }..  
5c30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c40: 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74 75   .** Rtree virtu
5c50: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
5c60: 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e 0a 2a 2f  xOpen method..*/
5c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
5c80: 65 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74  eOpen(sqlite3_vt
5c90: 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74  ab *pVTab, sqlit
5ca0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
5cb0: 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  *ppCursor){.  in
5cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
5cd0: 4d 45 4d 3b 0a 20 20 52 74 72 65 65 43 75 72 73  MEM;.  RtreeCurs
5ce0: 6f 72 20 2a 70 43 73 72 3b 0a 0a 20 20 70 43 73  or *pCsr;..  pCs
5cf0: 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72  r = (RtreeCursor
5d00: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
5d10: 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43 75  c(sizeof(RtreeCu
5d20: 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43  rsor));.  if( pC
5d30: 73 72 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  sr ){.    memset
5d40: 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCsr, 0, sizeof
5d50: 28 52 74 72 65 65 43 75 72 73 6f 72 29 29 3b 0a  (RtreeCursor));.
5d60: 20 20 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70      pCsr->base.p
5d70: 56 74 61 62 20 3d 20 70 56 54 61 62 3b 0a 20 20  Vtab = pVTab;.  
5d80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
5d90: 3b 0a 20 20 7d 0a 20 20 2a 70 70 43 75 72 73 6f  ;.  }.  *ppCurso
5da0: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  r = (sqlite3_vta
5db0: 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b  b_cursor *)pCsr;
5dc0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5dd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
5de0: 65 20 52 74 72 65 65 43 75 72 73 6f 72 2e 61 43  e RtreeCursor.aC
5df0: 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61  onstraint[] arra
5e00: 79 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  y and its conten
5e10: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
5e20: 69 64 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  id freeCursorCon
5e30: 73 74 72 61 69 6e 74 73 28 52 74 72 65 65 43 75  straints(RtreeCu
5e40: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
5e50: 66 28 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72  f( pCsr->aConstr
5e60: 61 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  aint ){.    int 
5e70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
5e90: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
5ea0: 6f 75 67 68 20 63 6f 6e 73 74 72 61 69 6e 74 20  ough constraint 
5eb0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 66 6f 72  array */.    for
5ec0: 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 43  (i=0; i<pCsr->nC
5ed0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
5ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5ef0: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70  tree_geometry *p
5f00: 47 65 6f 6d 20 3d 20 70 43 73 72 2d 3e 61 43 6f  Geom = pCsr->aCo
5f10: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 70 47 65 6f  nstraint[i].pGeo
5f20: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 65  m;.      if( pGe
5f30: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  om ){.        if
5f40: 28 20 70 47 65 6f 6d 2d 3e 78 44 65 6c 55 73 65  ( pGeom->xDelUse
5f50: 72 20 29 20 70 47 65 6f 6d 2d 3e 78 44 65 6c 55  r ) pGeom->xDelU
5f60: 73 65 72 28 70 47 65 6f 6d 2d 3e 70 55 73 65 72  ser(pGeom->pUser
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5f80: 65 33 5f 66 72 65 65 28 70 47 65 6f 6d 29 3b 0a  e3_free(pGeom);.
5f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5fa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5fb0: 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Csr->aConstraint
5fc0: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 43 6f  );.    pCsr->aCo
5fd0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 20 20  nstraint = 0;.  
5fe0: 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65  }.}../* .** Rtre
5ff0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
6000: 6d 6f 64 75 6c 65 20 78 43 6c 6f 73 65 20 6d 65  module xClose me
6010: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
6020: 69 6e 74 20 72 74 72 65 65 43 6c 6f 73 65 28 73  int rtreeClose(s
6030: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
6040: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 52 74 72 65  or *cur){.  Rtre
6050: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
6060: 65 65 20 2a 29 28 63 75 72 2d 3e 70 56 74 61 62  ee *)(cur->pVtab
6070: 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  );.  int rc;.  R
6080: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  treeCursor *pCsr
6090: 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f 72 20   = (RtreeCursor 
60a0: 2a 29 63 75 72 3b 0a 20 20 66 72 65 65 43 75 72  *)cur;.  freeCur
60b0: 73 6f 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70  sorConstraints(p
60c0: 43 73 72 29 3b 0a 20 20 72 63 20 3d 20 6e 6f 64  Csr);.  rc = nod
60d0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
60e0: 20 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20   pCsr->pNode);. 
60f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6100: 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
6110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65  ;.}../*.** Rtree
6120: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
6130: 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
6140: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
6150: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
6160: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
6170: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
6180: 74 6f 20 61 20 76 61 6c 69 64 20 0a 2a 2a 20 72  to a valid .** r
6190: 65 63 6f 72 64 20 28 69 2e 65 20 69 66 20 74 68  ecord (i.e if th
61a0: 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73  e scan has finis
61b0: 68 65 64 29 2c 20 6f 72 20 7a 65 72 6f 20 6f 74  hed), or zero ot
61c0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
61d0: 69 63 20 69 6e 74 20 72 74 72 65 65 45 6f 66 28  ic int rtreeEof(
61e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
61f0: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 52 74 72  sor *cur){.  Rtr
6200: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  eeCursor *pCsr =
6210: 20 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29   (RtreeCursor *)
6220: 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  cur;.  return (p
6230: 43 73 72 2d 3e 70 4e 6f 64 65 3d 3d 30 29 3b 0a  Csr->pNode==0);.
6240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 2d 74  }../*.** The r-t
6250: 72 65 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 70  ree constraint p
6260: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6270: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
6280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
6290: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74  .** guaranteed t
62a0: 6f 20 62 65 20 61 20 4d 41 54 43 48 20 63 6f 6e  o be a MATCH con
62b0: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
62c0: 69 63 20 69 6e 74 20 74 65 73 74 52 74 72 65 65  ic int testRtree
62d0: 47 65 6f 6d 28 0a 20 20 52 74 72 65 65 20 2a 70  Geom(.  Rtree *p
62e0: 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Rtree,          
62f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 2d 54 72 65          /* R-Tre
6300: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 74  e object */.  Rt
6310: 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  reeConstraint *p
6320: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 20 20 2f 2a  Constraint,   /*
6330: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
6340: 74 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 52  t to test */.  R
6350: 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c  treeCell *pCell,
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6370: 2a 20 43 65 6c 6c 20 74 6f 20 74 65 73 74 20 2a  * Cell to test *
6380: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 73 20 20  /.  int *pbRes  
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 73 74      /* OUT: Test
63b0: 20 72 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   result */.){.  
63c0: 69 6e 74 20 69 3b 0a 20 20 52 74 72 65 65 44 56  int i;.  RtreeDV
63d0: 61 6c 75 65 20 61 43 6f 6f 72 64 5b 52 54 52 45  alue aCoord[RTRE
63e0: 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53  E_MAX_DIMENSIONS
63f0: 2a 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6f 72  *2];.  int nCoor
6400: 64 20 3d 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d  d = pRtree->nDim
6410: 2a 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *2;..  assert( p
6420: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
6430: 52 54 52 45 45 5f 4d 41 54 43 48 20 29 3b 0a 20  RTREE_MATCH );. 
6440: 20 61 73 73 65 72 74 28 20 70 43 6f 6e 73 74 72   assert( pConstr
6450: 61 69 6e 74 2d 3e 70 47 65 6f 6d 20 29 3b 0a 0a  aint->pGeom );..
6460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6470: 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ord; i++){.    a
6480: 43 6f 6f 72 64 5b 69 5d 20 3d 20 44 43 4f 4f 52  Coord[i] = DCOOR
6490: 44 28 70 43 65 6c 6c 2d 3e 61 43 6f 6f 72 64 5b  D(pCell->aCoord[
64a0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
64b0: 6e 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 78  n pConstraint->x
64c0: 47 65 6f 6d 28 70 43 6f 6e 73 74 72 61 69 6e 74  Geom(pConstraint
64d0: 2d 3e 70 47 65 6f 6d 2c 20 6e 43 6f 6f 72 64 2c  ->pGeom, nCoord,
64e0: 20 61 43 6f 6f 72 64 2c 20 70 62 52 65 73 29 3b   aCoord, pbRes);
64f0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 75 72 73 6f  .}../* .** Curso
6500: 72 20 70 43 75 72 73 6f 72 20 63 75 72 72 65 6e  r pCursor curren
6510: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
6520: 63 65 6c 6c 20 69 6e 20 61 20 6e 6f 6e 2d 6c 65  cell in a non-le
6530: 61 66 20 70 61 67 65 2e 0a 2a 2a 20 53 65 74 20  af page..** Set 
6540: 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20 69  *pbEof to true i
6550: 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  f the sub-tree h
6560: 65 61 64 65 64 20 62 79 20 74 68 65 20 63 65 6c  eaded by the cel
6570: 6c 20 69 73 20 66 69 6c 74 65 72 65 64 0a 2a 2a  l is filtered.**
6580: 20 28 65 78 63 6c 75 64 65 64 29 20 62 79 20 74   (excluded) by t
6590: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  he constraints i
65a0: 6e 20 74 68 65 20 70 43 75 72 73 6f 72 2d 3e 61  n the pCursor->a
65b0: 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 20 0a 2a 2a  Constraint[] .**
65c0: 20 61 72 72 61 79 2c 20 6f 72 20 66 61 6c 73 65   array, or false
65d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
65e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
65f0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
6600: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
6610: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
6620: 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 77  rror.** occurs w
6630: 69 74 68 69 6e 20 61 20 67 65 6f 6d 65 74 72 79  ithin a geometry
6640: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
6650: 61 74 69 63 20 69 6e 74 20 74 65 73 74 52 74 72  atic int testRtr
6660: 65 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52  eeCell(Rtree *pR
6670: 74 72 65 65 2c 20 52 74 72 65 65 43 75 72 73 6f  tree, RtreeCurso
6680: 72 20 2a 70 43 75 72 73 6f 72 2c 20 69 6e 74 20  r *pCursor, int 
6690: 2a 70 62 45 6f 66 29 7b 0a 20 20 52 74 72 65 65  *pbEof){.  Rtree
66a0: 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 69 6e 74  Cell cell;.  int
66b0: 20 69 69 3b 0a 20 20 69 6e 74 20 62 52 65 73 20   ii;.  int bRes 
66c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
66d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 6e 6f  SQLITE_OK;..  no
66e0: 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65  deGetCell(pRtree
66f0: 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65  , pCursor->pNode
6700: 2c 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c  , pCursor->iCell
6710: 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  , &cell);.  for(
6720: 69 69 3d 30 3b 20 62 52 65 73 3d 3d 30 20 26 26  ii=0; bRes==0 &&
6730: 20 69 69 3c 70 43 75 72 73 6f 72 2d 3e 6e 43 6f   ii<pCursor->nCo
6740: 6e 73 74 72 61 69 6e 74 3b 20 69 69 2b 2b 29 7b  nstraint; ii++){
6750: 0a 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72  .    RtreeConstr
6760: 61 69 6e 74 20 2a 70 20 3d 20 26 70 43 75 72 73  aint *p = &pCurs
6770: 6f 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  or->aConstraint[
6780: 69 69 5d 3b 0a 20 20 20 20 52 74 72 65 65 44 56  ii];.    RtreeDV
6790: 61 6c 75 65 20 63 65 6c 6c 5f 6d 69 6e 20 3d 20  alue cell_min = 
67a0: 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43 6f 6f  DCOORD(cell.aCoo
67b0: 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e 3e 31  rd[(p->iCoord>>1
67c0: 29 2a 32 5d 29 3b 0a 20 20 20 20 52 74 72 65 65  )*2]);.    Rtree
67d0: 44 56 61 6c 75 65 20 63 65 6c 6c 5f 6d 61 78 20  DValue cell_max 
67e0: 3d 20 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61 43  = DCOORD(cell.aC
67f0: 6f 6f 72 64 5b 28 70 2d 3e 69 43 6f 6f 72 64 3e  oord[(p->iCoord>
6800: 3e 31 29 2a 32 2b 31 5d 29 3b 0a 0a 20 20 20 20  >1)*2+1]);..    
6810: 61 73 73 65 72 74 28 70 2d 3e 6f 70 3d 3d 52 54  assert(p->op==RT
6820: 52 45 45 5f 4c 45 20 7c 7c 20 70 2d 3e 6f 70 3d  REE_LE || p->op=
6830: 3d 52 54 52 45 45 5f 4c 54 20 7c 7c 20 70 2d 3e  =RTREE_LT || p->
6840: 6f 70 3d 3d 52 54 52 45 45 5f 47 45 20 0a 20 20  op==RTREE_GE .  
6850: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 3d 3d        || p->op==
6860: 52 54 52 45 45 5f 47 54 20 7c 7c 20 70 2d 3e 6f  RTREE_GT || p->o
6870: 70 3d 3d 52 54 52 45 45 5f 45 51 20 7c 7c 20 70  p==RTREE_EQ || p
6880: 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41 54 43  ->op==RTREE_MATC
6890: 48 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 73 77  H.    );..    sw
68a0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
68b0: 20 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f       case RTREE_
68c0: 4c 45 3a 20 63 61 73 65 20 52 54 52 45 45 5f 4c  LE: case RTREE_L
68d0: 54 3a 20 0a 20 20 20 20 20 20 20 20 62 52 65 73  T: .        bRes
68e0: 20 3d 20 70 2d 3e 72 56 61 6c 75 65 3c 63 65 6c   = p->rValue<cel
68f0: 6c 5f 6d 69 6e 3b 20 0a 20 20 20 20 20 20 20 20  l_min; .        
6900: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
6910: 73 65 20 52 54 52 45 45 5f 47 45 3a 20 63 61 73  se RTREE_GE: cas
6920: 65 20 52 54 52 45 45 5f 47 54 3a 20 0a 20 20 20  e RTREE_GT: .   
6930: 20 20 20 20 20 62 52 65 73 20 3d 20 70 2d 3e 72       bRes = p->r
6940: 56 61 6c 75 65 3e 63 65 6c 6c 5f 6d 61 78 3b 20  Value>cell_max; 
6950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6960: 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52 45  .      case RTRE
6970: 45 5f 45 51 3a 0a 20 20 20 20 20 20 20 20 62 52  E_EQ:.        bR
6980: 65 73 20 3d 20 28 70 2d 3e 72 56 61 6c 75 65 3e  es = (p->rValue>
6990: 63 65 6c 6c 5f 6d 61 78 20 7c 7c 20 70 2d 3e 72  cell_max || p->r
69a0: 56 61 6c 75 65 3c 63 65 6c 6c 5f 6d 69 6e 29 3b  Value<cell_min);
69b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
69c0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
69d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
69e0: 28 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d  ( p->op==RTREE_M
69f0: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20  ATCH );.        
6a00: 72 63 20 3d 20 74 65 73 74 52 74 72 65 65 47 65  rc = testRtreeGe
6a10: 6f 6d 28 70 52 74 72 65 65 2c 20 70 2c 20 26 63  om(pRtree, p, &c
6a20: 65 6c 6c 2c 20 26 62 52 65 73 29 3b 0a 20 20 20  ell, &bRes);.   
6a30: 20 20 20 20 20 62 52 65 73 20 3d 20 21 62 52 65       bRes = !bRe
6a40: 73 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  s;.        break
6a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a60: 20 20 7d 0a 0a 20 20 2a 70 62 45 6f 66 20 3d 20    }..  *pbEof = 
6a70: 62 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72  bRes;.  return r
6a80: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73  c;.}../* .** Tes
6a90: 74 20 69 66 20 74 68 65 20 63 65 6c 6c 20 74 68  t if the cell th
6aa0: 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 73 6f  at cursor pCurso
6ab0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
6ac0: 74 73 20 74 6f 0a 2a 2a 20 77 6f 75 6c 64 20 62  ts to.** would b
6ad0: 65 20 66 69 6c 74 65 72 65 64 20 28 65 78 63 6c  e filtered (excl
6ae0: 75 64 65 64 29 20 62 79 20 74 68 65 20 63 6f 6e  uded) by the con
6af0: 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
6b00: 0a 2a 2a 20 70 43 75 72 73 6f 72 2d 3e 61 43 6f  .** pCursor->aCo
6b10: 6e 73 74 72 61 69 6e 74 5b 5d 20 61 72 72 61 79  nstraint[] array
6b20: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 2a 70 62  . If so, set *pb
6b30: 45 6f 66 20 74 6f 20 74 72 75 65 20 62 65 66 6f  Eof to true befo
6b40: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
6b50: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   If the cell is 
6b60: 6e 6f 74 20 66 69 6c 74 65 72 65 64 20 28 65 78  not filtered (ex
6b70: 63 6c 75 64 65 64 29 20 62 79 20 74 68 65 20 63  cluded) by the c
6b80: 6f 6e 73 74 72 61 69 6e 74 73 2c 0a 2a 2a 20 73  onstraints,.** s
6b90: 65 74 20 70 62 45 6f 66 20 74 6f 20 7a 65 72 6f  et pbEof to zero
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
6bb0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
6bc0: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
6bd0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
6be0: 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
6bf0: 63 75 72 73 20 77 69 74 68 69 6e 20 61 20 67 65  curs within a ge
6c00: 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e  ometry callback.
6c10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6c20: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
6c30: 74 20 74 68 65 20 63 65 6c 6c 20 69 73 20 70 61  t the cell is pa
6c40: 72 74 20 6f 66 20 61 20 6c 65 61 66 20 6e 6f 64  rt of a leaf nod
6c50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6c60: 20 74 65 73 74 52 74 72 65 65 45 6e 74 72 79 28   testRtreeEntry(
6c70: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
6c80: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72  treeCursor *pCur
6c90: 73 6f 72 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29  sor, int *pbEof)
6ca0: 7b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65  {.  RtreeCell ce
6cb0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  ll;.  int ii;.  
6cc0: 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 6e  *pbEof = 0;..  n
6cd0: 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65  odeGetCell(pRtre
6ce0: 65 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64  e, pCursor->pNod
6cf0: 65 2c 20 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c  e, pCursor->iCel
6d00: 6c 2c 20 26 63 65 6c 6c 29 3b 0a 20 20 66 6f 72  l, &cell);.  for
6d10: 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 73 6f  (ii=0; ii<pCurso
6d20: 72 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  r->nConstraint; 
6d30: 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
6d40: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20  Constraint *p = 
6d50: 26 70 43 75 72 73 6f 72 2d 3e 61 43 6f 6e 73 74  &pCursor->aConst
6d60: 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 52  raint[ii];.    R
6d70: 74 72 65 65 44 56 61 6c 75 65 20 63 6f 6f 72 64  treeDValue coord
6d80: 20 3d 20 44 43 4f 4f 52 44 28 63 65 6c 6c 2e 61   = DCOORD(cell.a
6d90: 43 6f 6f 72 64 5b 70 2d 3e 69 43 6f 6f 72 64 5d  Coord[p->iCoord]
6da0: 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  );.    int res;.
6db0: 20 20 20 20 61 73 73 65 72 74 28 70 2d 3e 6f 70      assert(p->op
6dc0: 3d 3d 52 54 52 45 45 5f 4c 45 20 7c 7c 20 70 2d  ==RTREE_LE || p-
6dd0: 3e 6f 70 3d 3d 52 54 52 45 45 5f 4c 54 20 7c 7c  >op==RTREE_LT ||
6de0: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 47 45   p->op==RTREE_GE
6df0: 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e   .        || p->
6e00: 6f 70 3d 3d 52 54 52 45 45 5f 47 54 20 7c 7c 20  op==RTREE_GT || 
6e10: 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 45 51 20  p->op==RTREE_EQ 
6e20: 7c 7c 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f  || p->op==RTREE_
6e30: 4d 41 54 43 48 0a 20 20 20 20 29 3b 0a 20 20 20  MATCH.    );.   
6e40: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
6e50: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 54 52  {.      case RTR
6e60: 45 45 5f 4c 45 3a 20 72 65 73 20 3d 20 28 63 6f  EE_LE: res = (co
6e70: 6f 72 64 3c 3d 70 2d 3e 72 56 61 6c 75 65 29 3b  ord<=p->rValue);
6e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
6e90: 73 65 20 52 54 52 45 45 5f 4c 54 3a 20 72 65 73  se RTREE_LT: res
6ea0: 20 3d 20 28 63 6f 6f 72 64 3c 70 2d 3e 72 56 61   = (coord<p->rVa
6eb0: 6c 75 65 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20  lue);  break;.  
6ec0: 20 20 20 20 63 61 73 65 20 52 54 52 45 45 5f 47      case RTREE_G
6ed0: 45 3a 20 72 65 73 20 3d 20 28 63 6f 6f 72 64 3e  E: res = (coord>
6ee0: 3d 70 2d 3e 72 56 61 6c 75 65 29 3b 20 62 72 65  =p->rValue); bre
6ef0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 52  ak;.      case R
6f00: 54 52 45 45 5f 47 54 3a 20 72 65 73 20 3d 20 28  TREE_GT: res = (
6f10: 63 6f 6f 72 64 3e 70 2d 3e 72 56 61 6c 75 65 29  coord>p->rValue)
6f20: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
6f30: 63 61 73 65 20 52 54 52 45 45 5f 45 51 3a 20 72  case RTREE_EQ: r
6f40: 65 73 20 3d 20 28 63 6f 6f 72 64 3d 3d 70 2d 3e  es = (coord==p->
6f50: 72 56 61 6c 75 65 29 3b 20 62 72 65 61 6b 3b 0a  rValue); break;.
6f60: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
6f70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b  .        int rc;
6f80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6f90: 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45 5f 4d 41   p->op==RTREE_MA
6fa0: 54 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 72  TCH );.        r
6fb0: 63 20 3d 20 74 65 73 74 52 74 72 65 65 47 65 6f  c = testRtreeGeo
6fc0: 6d 28 70 52 74 72 65 65 2c 20 70 2c 20 26 63 65  m(pRtree, p, &ce
6fd0: 6c 6c 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  ll, &res);.     
6fe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6ff0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
7020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7030: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 72 65    }..    if( !re
7040: 73 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f  s ){.      *pbEo
7050: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  f = 1;.      ret
7060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7070: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
7080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7090: 0a 2f 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 70 43  ./*.** Cursor pC
70a0: 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
70b0: 70 6f 69 6e 74 73 20 61 74 20 61 20 6e 6f 64 65  points at a node
70c0: 20 74 68 61 74 20 68 65 61 64 73 20 61 20 73 75   that heads a su
70d0: 62 2d 74 72 65 65 20 6f 66 0a 2a 2a 20 68 65 69  b-tree of.** hei
70e0: 67 68 74 20 69 48 65 69 67 68 74 20 28 69 66 20  ght iHeight (if 
70f0: 69 48 65 69 67 68 74 3d 3d 30 2c 20 74 68 65 6e  iHeight==0, then
7100: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 61 20 6c   the node is a l
7110: 65 61 66 29 2e 20 44 65 73 63 65 6e 64 0a 2a 2a  eaf). Descend.**
7120: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
7130: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 65 6c 6c 20   left-most cell 
7140: 6f 66 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  of the sub-tree 
7150: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
7160: 20 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20   .** configured 
7170: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2f 0a  constraints..*/.
7180: 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 63 65  static int desce
7190: 6e 64 54 6f 43 65 6c 6c 28 0a 20 20 52 74 72 65  ndToCell(.  Rtre
71a0: 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52 74  e *pRtree, .  Rt
71b0: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 75 72 73  reeCursor *pCurs
71c0: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67  or, .  int iHeig
71d0: 68 74 2c 0a 20 20 69 6e 74 20 2a 70 45 6f 66 20  ht,.  int *pEof 
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74  /* OUT: Set to t
7200: 72 75 65 20 69 66 20 63 61 6e 6e 6f 74 20 64 65  rue if cannot de
7210: 73 63 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  scend */.){.  in
7220: 74 20 69 73 45 6f 66 3b 0a 20 20 69 6e 74 20 72  t isEof;.  int r
7230: 63 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 52  c;.  int ii;.  R
7240: 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
7250: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
7260: 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 52 74 72  4 iRowid;..  Rtr
7270: 65 65 4e 6f 64 65 20 2a 70 53 61 76 65 64 4e 6f  eeNode *pSavedNo
7280: 64 65 20 3d 20 70 43 75 72 73 6f 72 2d 3e 70 4e  de = pCursor->pN
7290: 6f 64 65 3b 0a 20 20 69 6e 74 20 69 53 61 76 65  ode;.  int iSave
72a0: 64 43 65 6c 6c 20 3d 20 70 43 75 72 73 6f 72 2d  dCell = pCursor-
72b0: 3e 69 43 65 6c 6c 3b 0a 0a 20 20 61 73 73 65 72  >iCell;..  asser
72c0: 74 28 20 69 48 65 69 67 68 74 3e 3d 30 20 29 3b  t( iHeight>=0 );
72d0: 0a 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d  ..  if( iHeight=
72e0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  =0 ){.    rc = t
72f0: 65 73 74 52 74 72 65 65 45 6e 74 72 79 28 70 52  estRtreeEntry(pR
7300: 74 72 65 65 2c 20 70 43 75 72 73 6f 72 2c 20 26  tree, pCursor, &
7310: 69 73 45 6f 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  isEof);.  }else{
7320: 0a 20 20 20 20 72 63 20 3d 20 74 65 73 74 52 74  .    rc = testRt
7330: 72 65 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  reeCell(pRtree, 
7340: 70 43 75 72 73 6f 72 2c 20 26 69 73 45 6f 66 29  pCursor, &isEof)
7350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
7360: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 45  SQLITE_OK || isE
7370: 6f 66 20 7c 7c 20 69 48 65 69 67 68 74 3d 3d 30  of || iHeight==0
7380: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 73   ){.    goto des
7390: 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c 5f 6f 75 74  cend_to_cell_out
73a0: 3b 0a 20 20 7d 0a 0a 20 20 69 52 6f 77 69 64 20  ;.  }..  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 43 75 72 73 6f 72 2d 3e  Rtree, pCursor->
73d0: 70 4e 6f 64 65 2c 20 70 43 75 72 73 6f 72 2d 3e  pNode, pCursor->
73e0: 69 43 65 6c 6c 29 3b 0a 20 20 72 63 20 3d 20 6e  iCell);.  rc = n
73f0: 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65  odeAcquire(pRtre
7400: 65 2c 20 69 52 6f 77 69 64 2c 20 70 43 75 72 73  e, iRowid, pCurs
7410: 6f 72 2d 3e 70 4e 6f 64 65 2c 20 26 70 43 68 69  or->pNode, &pChi
7420: 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ld);.  if( rc!=S
7430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7440: 67 6f 74 6f 20 64 65 73 63 65 6e 64 5f 74 6f 5f  goto descend_to_
7450: 63 65 6c 6c 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  cell_out;.  }.. 
7460: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
7470: 72 65 65 2c 20 70 43 75 72 73 6f 72 2d 3e 70 4e  ree, pCursor->pN
7480: 6f 64 65 29 3b 0a 20 20 70 43 75 72 73 6f 72 2d  ode);.  pCursor-
7490: 3e 70 4e 6f 64 65 20 3d 20 70 43 68 69 6c 64 3b  >pNode = pChild;
74a0: 0a 20 20 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  .  isEof = 1;.  
74b0: 66 6f 72 28 69 69 3d 30 3b 20 69 73 45 6f 66 20  for(ii=0; isEof 
74c0: 26 26 20 69 69 3c 4e 43 45 4c 4c 28 70 43 68 69  && ii<NCELL(pChi
74d0: 6c 64 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ld); ii++){.    
74e0: 70 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 20 3d  pCursor->iCell =
74f0: 20 69 69 3b 0a 20 20 20 20 72 63 20 3d 20 64 65   ii;.    rc = de
7500: 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52 74 72  scendToCell(pRtr
7510: 65 65 2c 20 70 43 75 72 73 6f 72 2c 20 69 48 65  ee, pCursor, iHe
7520: 69 67 68 74 2d 31 2c 20 26 69 73 45 6f 66 29 3b  ight-1, &isEof);
7530: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7550: 67 6f 74 6f 20 64 65 73 63 65 6e 64 5f 74 6f 5f  goto descend_to_
7560: 63 65 6c 6c 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cell_out;.    }.
7570: 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 45 6f 66    }..  if( isEof
7580: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7590: 70 43 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 3d 3d  pCursor->pNode==
75a0: 70 43 68 69 6c 64 20 29 3b 0a 20 20 20 20 6e 6f  pChild );.    no
75b0: 64 65 52 65 66 65 72 65 6e 63 65 28 70 53 61 76  deReference(pSav
75c0: 65 64 4e 6f 64 65 29 3b 0a 20 20 20 20 6e 6f 64  edNode);.    nod
75d0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
75e0: 20 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 70 43   pChild);.    pC
75f0: 75 72 73 6f 72 2d 3e 70 4e 6f 64 65 20 3d 20 70  ursor->pNode = p
7600: 53 61 76 65 64 4e 6f 64 65 3b 0a 20 20 20 20 70  SavedNode;.    p
7610: 43 75 72 73 6f 72 2d 3e 69 43 65 6c 6c 20 3d 20  Cursor->iCell = 
7620: 69 53 61 76 65 64 43 65 6c 6c 3b 0a 20 20 7d 0a  iSavedCell;.  }.
7630: 0a 64 65 73 63 65 6e 64 5f 74 6f 5f 63 65 6c 6c  .descend_to_cell
7640: 5f 6f 75 74 3a 0a 20 20 2a 70 45 6f 66 20 3d 20  _out:.  *pEof = 
7650: 69 73 45 6f 66 3b 0a 20 20 72 65 74 75 72 6e 20  isEof;.  return 
7660: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  rc;.}../*.** One
7670: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
7680: 20 6e 6f 64 65 20 70 4e 6f 64 65 20 69 73 20 67   node pNode is g
7690: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
76a0: 65 20 61 20 36 34 2d 62 69 74 20 0a 2a 2a 20 69  e a 64-bit .** i
76b0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 65 71 75  nteger value equ
76c0: 61 6c 20 74 6f 20 69 52 6f 77 69 64 2e 20 52 65  al to iRowid. Re
76d0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
76e0: 66 20 74 68 69 73 20 63 65 6c 6c 2e 0a 2a 2f 0a  f this cell..*/.
76f0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52  static int nodeR
7700: 6f 77 69 64 49 6e 64 65 78 28 0a 20 20 52 74 72  owidIndex(.  Rtr
7710: 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 52  ee *pRtree, .  R
7720: 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  treeNode *pNode,
7730: 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a   .  i64 iRowid,.
7740: 20 20 69 6e 74 20 2a 70 69 49 6e 64 65 78 0a 29    int *piIndex.)
7750: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
7760: 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
7770: 70 4e 6f 64 65 29 3b 0a 20 20 66 6f 72 28 69 69  pNode);.  for(ii
7780: 3d 30 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69  =0; ii<nCell; ii
7790: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 64  ++){.    if( nod
77a0: 65 47 65 74 52 6f 77 69 64 28 70 52 74 72 65 65  eGetRowid(pRtree
77b0: 2c 20 70 4e 6f 64 65 2c 20 69 69 29 3d 3d 69 52  , pNode, ii)==iR
77c0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2a 70  owid ){.      *p
77d0: 69 49 6e 64 65 78 20 3d 20 69 69 3b 0a 20 20 20  iIndex = ii;.   
77e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
77f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
7800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7810: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 7d 0a 0a  ORRUPT_VTAB;.}..
7820: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7830: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 65   index of the ce
7840: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ll containing a 
7850: 70 6f 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20  pointer to node 
7860: 70 4e 6f 64 65 0a 2a 2a 20 69 6e 20 69 74 73 20  pNode.** in its 
7870: 70 61 72 65 6e 74 2e 20 49 66 20 70 4e 6f 64 65  parent. If pNode
7880: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   is the root nod
7890: 65 2c 20 72 65 74 75 72 6e 20 2d 31 2e 0a 2a 2f  e, return -1..*/
78a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
78b0: 50 61 72 65 6e 74 49 6e 64 65 78 28 52 74 72 65  ParentIndex(Rtre
78c0: 65 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65  e *pRtree, Rtree
78d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Node *pNode, int
78e0: 20 2a 70 69 49 6e 64 65 78 29 7b 0a 20 20 52 74   *piIndex){.  Rt
78f0: 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74  reeNode *pParent
7900: 20 3d 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e   = pNode->pParen
7910: 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
7920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   ){.    return n
7930: 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70 52  odeRowidIndex(pR
7940: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  tree, pParent, p
7950: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 70 69 49  Node->iNode, piI
7960: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  ndex);.  }.  *pi
7970: 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 72 65  Index = -1;.  re
7980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7990: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
79a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
79b0: 64 75 6c 65 20 78 4e 65 78 74 20 6d 65 74 68 6f  dule xNext metho
79c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
79d0: 20 72 74 72 65 65 4e 65 78 74 28 73 71 6c 69 74   rtreeNext(sqlit
79e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
79f0: 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
7a00: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
7a10: 28 52 74 72 65 65 20 2a 29 28 70 56 74 61 62 43  (Rtree *)(pVtabC
7a20: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
7a30: 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43   RtreeCursor *pC
7a40: 73 72 20 3d 20 28 52 74 72 65 65 43 75 72 73 6f  sr = (RtreeCurso
7a50: 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  r *)pVtabCursor;
7a60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7a70: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 52 74 72  TE_OK;..  /* Rtr
7a80: 65 65 43 75 72 73 6f 72 2e 70 4e 6f 64 65 20 6d  eeCursor.pNode m
7a90: 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
7aa0: 20 49 66 20 69 73 20 69 73 20 4e 55 4c 4c 2c 20   If is is NULL, 
7ab0: 74 68 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  then this cursor
7ac0: 20 69 73 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79   is.  ** already
7ad0: 20 61 74 20 45 4f 46 2e 20 49 74 20 69 73 20 61   at EOF. It is a
7ae0: 67 61 69 6e 73 74 20 74 68 65 20 72 75 6c 65 73  gainst the rules
7af0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 4e 65   to call the xNe
7b00: 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 0a 20  xt() method of. 
7b10: 20 2a 2a 20 61 20 63 75 72 73 6f 72 20 74 68 61   ** a cursor tha
7b20: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 65  t has already re
7b30: 61 63 68 65 64 20 45 4f 46 2e 0a 20 20 2a 2f 0a  ached EOF..  */.
7b40: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
7b50: 70 4e 6f 64 65 20 29 3b 0a 0a 20 20 69 66 28 20  pNode );..  if( 
7b60: 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67 79 3d  pCsr->iStrategy=
7b70: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =1 ){.    /* Thi
7b80: 73 20 22 73 63 61 6e 22 20 69 73 20 61 20 64 69  s "scan" is a di
7b90: 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72  rect lookup by r
7ba0: 6f 77 69 64 2e 20 54 68 65 72 65 20 69 73 20 6e  owid. There is n
7bb0: 6f 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 2a 2f  o next entry. */
7bc0: 0a 20 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65  .    nodeRelease
7bd0: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
7be0: 4e 6f 64 65 29 3b 0a 20 20 20 20 70 43 73 72 2d  Node);.    pCsr-
7bf0: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65  >pNode = 0;.  }e
7c00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  lse{.    /* Move
7c10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
7c20: 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ry that matches 
7c30: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63  the configured c
7c40: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 2a 2f 0a 20  onstraints. */. 
7c50: 20 20 20 69 6e 74 20 69 48 65 69 67 68 74 20 3d     int iHeight =
7c60: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
7c70: 43 73 72 2d 3e 70 4e 6f 64 65 20 29 7b 0a 20 20  Csr->pNode ){.  
7c80: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
7c90: 4e 6f 64 65 20 3d 20 70 43 73 72 2d 3e 70 4e 6f  Node = pCsr->pNo
7ca0: 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  de;.      int nC
7cb0: 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64  ell = NCELL(pNod
7cc0: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 43  e);.      for(pC
7cd0: 73 72 2d 3e 69 43 65 6c 6c 2b 2b 3b 20 70 43 73  sr->iCell++; pCs
7ce0: 72 2d 3e 69 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20  r->iCell<nCell; 
7cf0: 70 43 73 72 2d 3e 69 43 65 6c 6c 2b 2b 29 7b 0a  pCsr->iCell++){.
7d00: 20 20 20 20 20 20 20 20 69 6e 74 20 69 73 45 6f          int isEo
7d10: 66 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  f;.        rc = 
7d20: 64 65 73 63 65 6e 64 54 6f 43 65 6c 6c 28 70 52  descendToCell(pR
7d30: 74 72 65 65 2c 20 70 43 73 72 2c 20 69 48 65 69  tree, pCsr, iHei
7d40: 67 68 74 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  ght, &isEof);.  
7d50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
7d60: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 69 73 45 6f  LITE_OK || !isEo
7d70: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  f ){.          r
7d80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7da0: 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20 3d 20    pCsr->pNode = 
7db0: 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pNode->pParent;.
7dc0: 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 50        rc = nodeP
7dd0: 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74 72 65  arentIndex(pRtre
7de0: 65 2c 20 70 4e 6f 64 65 2c 20 26 70 43 73 72 2d  e, pNode, &pCsr-
7df0: 3e 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 69  >iCell);.      i
7e00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7e20: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
7e30: 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e       nodeReferen
7e40: 63 65 28 70 43 73 72 2d 3e 70 4e 6f 64 65 29 3b  ce(pCsr->pNode);
7e50: 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 6c 65 61  .      nodeRelea
7e60: 73 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  se(pRtree, pNode
7e70: 29 3b 0a 20 20 20 20 20 20 69 48 65 69 67 68 74  );.      iHeight
7e80: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
7e90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7ea0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
7eb0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
7ec0: 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 0a   xRowid method..
7ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
7ee0: 72 65 65 52 6f 77 69 64 28 73 71 6c 69 74 65 33  reeRowid(sqlite3
7ef0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
7f00: 74 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74  tabCursor, sqlit
7f10: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
7f20: 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65  {.  Rtree *pRtre
7f30: 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56 74  e = (Rtree *)pVt
7f40: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b  abCursor->pVtab;
7f50: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
7f60: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
7f70: 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f  sor *)pVtabCurso
7f80: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 43 73  r;..  assert(pCs
7f90: 72 2d 3e 70 4e 6f 64 65 29 3b 0a 20 20 2a 70 52  r->pNode);.  *pR
7fa0: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
7fb0: 77 69 64 28 70 52 74 72 65 65 2c 20 70 43 73 72  wid(pRtree, pCsr
7fc0: 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69  ->pNode, pCsr->i
7fd0: 43 65 6c 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Cell);..  return
7fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7ff0: 2a 20 0a 2a 2a 20 52 74 72 65 65 20 76 69 72 74  * .** Rtree virt
8000: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
8010: 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2e   xColumn method.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8030: 74 72 65 65 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  treeColumn(sqlit
8040: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
8050: 63 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e  cur, sqlite3_con
8060: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69  text *ctx, int i
8070: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
8080: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 63 75  ee = (Rtree *)cu
8090: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
80a0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
80b0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63  (RtreeCursor *)c
80c0: 75 72 3b 0a 0a 20 20 69 66 28 20 69 3d 3d 30 20  ur;..  if( i==0 
80d0: 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
80e0: 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f 77 69 64  d = nodeGetRowid
80f0: 28 70 52 74 72 65 65 2c 20 70 43 73 72 2d 3e 70  (pRtree, pCsr->p
8100: 4e 6f 64 65 2c 20 70 43 73 72 2d 3e 69 43 65 6c  Node, pCsr->iCel
8110: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
8120: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
8130: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  , iRowid);.  }el
8140: 73 65 7b 0a 20 20 20 20 52 74 72 65 65 43 6f 6f  se{.    RtreeCoo
8150: 72 64 20 63 3b 0a 20 20 20 20 6e 6f 64 65 47 65  rd c;.    nodeGe
8160: 74 43 6f 6f 72 64 28 70 52 74 72 65 65 2c 20 70  tCoord(pRtree, p
8170: 43 73 72 2d 3e 70 4e 6f 64 65 2c 20 70 43 73 72  Csr->pNode, pCsr
8180: 2d 3e 69 43 65 6c 6c 2c 20 69 2d 31 2c 20 26 63  ->iCell, i-1, &c
8190: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
81a0: 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59  E_RTREE_INT_ONLY
81b0: 0a 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d  .    if( pRtree-
81c0: 3e 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52  >eCoordType==RTR
81d0: 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20  EE_COORD_REAL32 
81e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
81f0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
8200: 74 78 2c 20 63 2e 66 29 3b 0a 20 20 20 20 7d 65  tx, c.f);.    }e
8210: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
8220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8230: 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70  Rtree->eCoordTyp
8240: 65 3d 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49  e==RTREE_COORD_I
8250: 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20 73 71  NT32 );.      sq
8260: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
8270: 28 63 74 78 2c 20 63 2e 69 29 3b 0a 20 20 20 20  (ctx, c.i);.    
8280: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8290: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
82a0: 20 0a 2a 2a 20 55 73 65 20 6e 6f 64 65 41 63 71   .** Use nodeAcq
82b0: 75 69 72 65 28 29 20 74 6f 20 6f 62 74 61 69 6e  uire() to obtain
82c0: 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 63   the leaf node c
82d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
82e0: 63 6f 72 64 20 77 69 74 68 20 0a 2a 2a 20 72 6f  cord with .** ro
82f0: 77 69 64 20 69 52 6f 77 69 64 2e 20 49 66 20 73  wid iRowid. If s
8300: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
8310: 70 70 4c 65 61 66 20 74 6f 20 70 6f 69 6e 74 20  ppLeaf to point 
8320: 74 6f 20 74 68 65 20 6e 6f 64 65 20 61 6e 64 0a  to the node and.
8330: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
8340: 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
8350: 20 6e 6f 20 73 75 63 68 20 72 65 63 6f 72 64 20   no such record 
8360: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 73 65  in the table, se
8370: 74 0a 2a 2a 20 2a 70 70 4c 65 61 66 20 74 6f 20  t.** *ppLeaf to 
8380: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
8390: 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72  ITE_OK. If an er
83a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
83b0: 2a 70 70 4c 65 61 66 0a 2a 2a 20 74 6f 20 7a 65  *ppLeaf.** to ze
83c0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
83d0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
83e0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
83f0: 74 20 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 52  t findLeafNode(R
8400: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 69 36  tree *pRtree, i6
8410: 34 20 69 52 6f 77 69 64 2c 20 52 74 72 65 65 4e  4 iRowid, RtreeN
8420: 6f 64 65 20 2a 2a 70 70 4c 65 61 66 29 7b 0a 20  ode **ppLeaf){. 
8430: 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70 4c 65   int rc;.  *ppLe
8440: 61 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  af = 0;.  sqlite
8450: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
8460: 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69 64 2c  ree->pReadRowid,
8470: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69   1, iRowid);.  i
8480: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
8490: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
84a0: 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  id)==SQLITE_ROW 
84b0: 29 7b 0a 20 20 20 20 69 36 34 20 69 4e 6f 64 65  ){.    i64 iNode
84c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
84d0: 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e  n_int64(pRtree->
84e0: 70 52 65 61 64 52 6f 77 69 64 2c 20 30 29 3b 0a  pReadRowid, 0);.
84f0: 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71      rc = nodeAcq
8500: 75 69 72 65 28 70 52 74 72 65 65 2c 20 69 4e 6f  uire(pRtree, iNo
8510: 64 65 2c 20 30 2c 20 70 70 4c 65 61 66 29 3b 0a  de, 0, ppLeaf);.
8520: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
8530: 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  t(pRtree->pReadR
8540: 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
8550: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8560: 5f 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70  _reset(pRtree->p
8570: 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  ReadRowid);.  }.
8580: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8590: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
85a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
85b0: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 52   configure the R
85c0: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 6f  treeConstraint o
85d0: 62 6a 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20  bject passed.** 
85e0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
85f0: 67 75 6d 65 6e 74 20 66 6f 72 20 61 20 4d 41 54  gument for a MAT
8600: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54  CH constraint. T
8610: 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
8620: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
8630: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8640: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
8650: 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72   right-hand oper
8660: 61 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48  and to the MATCH
8670: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  .** operator..*/
8680: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 73 65  .static int dese
8690: 72 69 61 6c 69 7a 65 47 65 6f 6d 65 74 72 79 28  rializeGeometry(
86a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
86b0: 56 61 6c 75 65 2c 20 52 74 72 65 65 43 6f 6e 73  Value, RtreeCons
86c0: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 29 7b 0a  traint *pCons){.
86d0: 20 20 52 74 72 65 65 4d 61 74 63 68 41 72 67 20    RtreeMatchArg 
86e0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74  *p;.  sqlite3_rt
86f0: 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 47  ree_geometry *pG
8700: 65 6f 6d 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  eom;.  int nBlob
8710: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
8720: 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 74 75  at value is actu
8730: 61 6c 6c 79 20 61 20 62 6c 6f 62 2e 20 2a 2f 0a  ally a blob. */.
8740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8750: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29  lue_type(pValue)
8760: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 20  !=SQLITE_BLOB ) 
8770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8780: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ROR;..  /* Check
8790: 20 74 68 61 74 20 74 68 65 20 62 6c 6f 62 20 69   that the blob i
87a0: 73 20 72 6f 75 67 68 6c 79 20 74 68 65 20 72 69  s roughly the ri
87b0: 67 68 74 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 6e  ght size. */.  n
87c0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
87d0: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
87e0: 65 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 3c  e);.  if( nBlob<
87f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 52 74 72 65  (int)sizeof(Rtre
8800: 65 4d 61 74 63 68 41 72 67 29 20 0a 20 20 20 7c  eMatchArg) .   |
8810: 7c 20 28 28 6e 42 6c 6f 62 2d 73 69 7a 65 6f 66  | ((nBlob-sizeof
8820: 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 29 29  (RtreeMatchArg))
8830: 25 73 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61  %sizeof(RtreeDVa
8840: 6c 75 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  lue))!=0.  ){.  
8850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8860: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 47  ERROR;.  }..  pG
8870: 65 6f 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 72  eom = (sqlite3_r
8880: 74 72 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 29  tree_geometry *)
8890: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 0a  sqlite3_malloc(.
88a0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 71 6c        sizeof(sql
88b0: 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
88c0: 74 72 79 29 20 2b 20 6e 42 6c 6f 62 0a 20 20 29  try) + nBlob.  )
88d0: 3b 0a 20 20 69 66 28 20 21 70 47 65 6f 6d 20 29  ;.  if( !pGeom )
88e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
88f0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
8900: 47 65 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Geom, 0, sizeof(
8910: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
8920: 6f 6d 65 74 72 79 29 29 3b 0a 20 20 70 20 3d 20  ometry));.  p = 
8930: 28 52 74 72 65 65 4d 61 74 63 68 41 72 67 20 2a  (RtreeMatchArg *
8940: 29 26 70 47 65 6f 6d 5b 31 5d 3b 0a 0a 20 20 6d  )&pGeom[1];..  m
8950: 65 6d 63 70 79 28 70 2c 20 73 71 6c 69 74 65 33  emcpy(p, sqlite3
8960: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
8970: 75 65 29 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 69  ue), nBlob);.  i
8980: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 52 54 52  f( p->magic!=RTR
8990: 45 45 5f 47 45 4f 4d 45 54 52 59 5f 4d 41 47 49  EE_GEOMETRY_MAGI
89a0: 43 20 0a 20 20 20 7c 7c 20 6e 42 6c 6f 62 21 3d  C .   || nBlob!=
89b0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 52 74 72  (int)(sizeof(Rtr
89c0: 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28 70  eeMatchArg) + (p
89d0: 2d 3e 6e 50 61 72 61 6d 2d 31 29 2a 73 69 7a 65  ->nParam-1)*size
89e0: 6f 66 28 52 74 72 65 65 44 56 61 6c 75 65 29 29  of(RtreeDValue))
89f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
8a00: 33 5f 66 72 65 65 28 70 47 65 6f 6d 29 3b 0a 20  3_free(pGeom);. 
8a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8a20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
8a30: 47 65 6f 6d 2d 3e 70 43 6f 6e 74 65 78 74 20 3d  Geom->pContext =
8a40: 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3b 0a 20 20   p->pContext;.  
8a50: 70 47 65 6f 6d 2d 3e 6e 50 61 72 61 6d 20 3d 20  pGeom->nParam = 
8a60: 70 2d 3e 6e 50 61 72 61 6d 3b 0a 20 20 70 47 65  p->nParam;.  pGe
8a70: 6f 6d 2d 3e 61 50 61 72 61 6d 20 3d 20 70 2d 3e  om->aParam = p->
8a80: 61 50 61 72 61 6d 3b 0a 0a 20 20 70 43 6f 6e 73  aParam;..  pCons
8a90: 2d 3e 78 47 65 6f 6d 20 3d 20 70 2d 3e 78 47 65  ->xGeom = p->xGe
8aa0: 6f 6d 3b 0a 20 20 70 43 6f 6e 73 2d 3e 70 47 65  om;.  pCons->pGe
8ab0: 6f 6d 20 3d 20 70 47 65 6f 6d 3b 0a 20 20 72 65  om = pGeom;.  re
8ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ad0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 74 72 65 65 20  }../* .** Rtree 
8ae0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
8af0: 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74  dule xFilter met
8b00: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
8b10: 6e 74 20 72 74 72 65 65 46 69 6c 74 65 72 28 0a  nt rtreeFilter(.
8b20: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
8b30: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
8b40: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
8b50: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
8b60: 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
8b70: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
8b80: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74 72   **argv.){.  Rtr
8b90: 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74  ee *pRtree = (Rt
8ba0: 72 65 65 20 2a 29 70 56 74 61 62 43 75 72 73 6f  ree *)pVtabCurso
8bb0: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
8bc0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
8bd0: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70  (RtreeCursor *)p
8be0: 56 74 61 62 43 75 72 73 6f 72 3b 0a 0a 20 20 52  VtabCursor;..  R
8bf0: 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20  treeNode *pRoot 
8c00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  = 0;.  int ii;. 
8c10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8c20: 5f 4f 4b 3b 0a 0a 20 20 72 74 72 65 65 52 65 66  _OK;..  rtreeRef
8c30: 65 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b 0a  erence(pRtree);.
8c40: 0a 20 20 66 72 65 65 43 75 72 73 6f 72 43 6f 6e  .  freeCursorCon
8c50: 73 74 72 61 69 6e 74 73 28 70 43 73 72 29 3b 0a  straints(pCsr);.
8c60: 20 20 70 43 73 72 2d 3e 69 53 74 72 61 74 65 67    pCsr->iStrateg
8c70: 79 20 3d 20 69 64 78 4e 75 6d 3b 0a 0a 20 20 69  y = idxNum;..  i
8c80: 66 28 20 69 64 78 4e 75 6d 3d 3d 31 20 29 7b 0a  f( idxNum==1 ){.
8c90: 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63      /* Special c
8ca0: 61 73 65 20 2d 20 6c 6f 6f 6b 75 70 20 62 79 20  ase - lookup by 
8cb0: 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 52 74  rowid. */.    Rt
8cc0: 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 3b 20  reeNode *pLeaf; 
8cd0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 6f         /* Leaf o
8ce0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 71 75  n which the requ
8cf0: 69 72 65 64 20 63 65 6c 6c 20 72 65 73 69 64 65  ired cell reside
8d00: 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  s */.    i64 iRo
8d10: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
8d20: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
8d30: 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ]);.    rc = fin
8d40: 64 4c 65 61 66 4e 6f 64 65 28 70 52 74 72 65 65  dLeafNode(pRtree
8d50: 2c 20 69 52 6f 77 69 64 2c 20 26 70 4c 65 61 66  , iRowid, &pLeaf
8d60: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f  );.    pCsr->pNo
8d70: 64 65 20 3d 20 70 4c 65 61 66 3b 20 0a 20 20 20  de = pLeaf; .   
8d80: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
8d90: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
8da0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8db0: 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69     rc = nodeRowi
8dc0: 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  dIndex(pRtree, p
8dd0: 4c 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 70  Leaf, iRowid, &p
8de0: 43 73 72 2d 3e 69 43 65 6c 6c 29 3b 0a 20 20 20  Csr->iCell);.   
8df0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8e00: 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73 65 20 2d  /* Normal case -
8e10: 20 72 2d 74 72 65 65 20 73 63 61 6e 2e 20 53 65   r-tree scan. Se
8e20: 74 20 75 70 20 74 68 65 20 52 74 72 65 65 43 75  t up the RtreeCu
8e30: 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69 6e 74  rsor.aConstraint
8e40: 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 77   array .    ** w
8e50: 69 74 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ith the configur
8e60: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ed constraints. 
8e70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8e80: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  argc>0 ){.      
8e90: 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  pCsr->aConstrain
8ea0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
8eb0: 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43  oc(sizeof(RtreeC
8ec0: 6f 6e 73 74 72 61 69 6e 74 29 2a 61 72 67 63 29  onstraint)*argc)
8ed0: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 43  ;.      pCsr->nC
8ee0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 61 72 67 63  onstraint = argc
8ef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 73  ;.      if( !pCs
8f00: 72 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 29  r->aConstraint )
8f10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
8f20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8f40: 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61    memset(pCsr->a
8f50: 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c 20 73  Constraint, 0, s
8f60: 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e 73 74  izeof(RtreeConst
8f70: 72 61 69 6e 74 29 2a 61 72 67 63 29 3b 0a 20 20  raint)*argc);.  
8f80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
8f90: 64 78 53 74 72 3d 3d 30 20 26 26 20 61 72 67 63  dxStr==0 && argc
8fa0: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
8fb0: 20 20 20 20 20 7c 7c 20 28 69 64 78 53 74 72 20       || (idxStr 
8fc0: 26 26 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 69  && (int)strlen(i
8fd0: 64 78 53 74 72 29 3d 3d 61 72 67 63 2a 32 29 20  dxStr)==argc*2) 
8fe0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
8ff0: 69 3d 30 3b 20 69 69 3c 61 72 67 63 3b 20 69 69  i=0; ii<argc; ii
9000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 52  ++){.          R
9010: 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a  treeConstraint *
9020: 70 20 3d 20 26 70 43 73 72 2d 3e 61 43 6f 6e 73  p = &pCsr->aCons
9030: 74 72 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  traint[ii];.    
9040: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 69 64        p->op = id
9050: 78 53 74 72 5b 69 69 2a 32 5d 3b 0a 20 20 20 20  xStr[ii*2];.    
9060: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20        p->iCoord 
9070: 3d 20 69 64 78 53 74 72 5b 69 69 2a 32 2b 31 5d  = idxStr[ii*2+1]
9080: 2d 27 61 27 3b 0a 20 20 20 20 20 20 20 20 20 20  -'a';.          
9090: 69 66 28 20 70 2d 3e 6f 70 3d 3d 52 54 52 45 45  if( p->op==RTREE
90a0: 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20  _MATCH ){.      
90b0: 20 20 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48        /* A MATCH
90c0: 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 72   operator. The r
90d0: 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6d  ight-hand-side m
90e0: 75 73 74 20 62 65 20 61 20 62 6c 6f 62 20 74 68  ust be a blob th
90f0: 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
9100: 2a 20 63 61 6e 20 62 65 20 63 61 73 74 20 69 6e  * can be cast in
9110: 74 6f 20 61 6e 20 52 74 72 65 65 4d 61 74 63 68  to an RtreeMatch
9120: 41 72 67 20 6f 62 6a 65 63 74 2e 20 4f 6e 65 20  Arg object. One 
9130: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
9140: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
9150: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
9160: 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28  ometry_callback(
9170: 29 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63 74  ) SQL user funct
9180: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
9190: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
91a0: 72 63 20 3d 20 64 65 73 65 72 69 61 6c 69 7a 65  rc = deserialize
91b0: 47 65 6f 6d 65 74 72 79 28 61 72 67 76 5b 69 69  Geometry(argv[ii
91c0: 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ], p);.         
91d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
91e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
91f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9200: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9210: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
9220: 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
9230: 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20  INT_ONLY.       
9240: 20 20 20 20 20 70 2d 3e 72 56 61 6c 75 65 20 3d       p->rValue =
9250: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
9260: 6e 74 36 34 28 61 72 67 76 5b 69 69 5d 29 3b 0a  nt64(argv[ii]);.
9270: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
9280: 20 20 70 2d 3e 72 56 61 6c 75 65 20 3d 20 73 71    p->rValue = sq
9290: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
92a0: 6c 65 28 61 72 67 76 5b 69 69 5d 29 3b 0a 23 65  le(argv[ii]);.#e
92b0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
92c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
92e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
92f0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d  K ){.      pCsr-
9300: 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >pNode = 0;.    
9310: 20 20 72 63 20 3d 20 6e 6f 64 65 41 63 71 75 69    rc = nodeAcqui
9320: 72 65 28 70 52 74 72 65 65 2c 20 31 2c 20 30 2c  re(pRtree, 1, 0,
9330: 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a   &pRoot);.    }.
9340: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9350: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
9360: 6e 74 20 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20  nt isEof = 1;.  
9370: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
9380: 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3b 0a 20 20  NCELL(pRoot);.  
9390: 20 20 20 20 70 43 73 72 2d 3e 70 4e 6f 64 65 20      pCsr->pNode 
93a0: 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 66  = pRoot;.      f
93b0: 6f 72 28 70 43 73 72 2d 3e 69 43 65 6c 6c 3d 30  or(pCsr->iCell=0
93c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
93d0: 26 26 20 70 43 73 72 2d 3e 69 43 65 6c 6c 3c 6e  && pCsr->iCell<n
93e0: 43 65 6c 6c 3b 20 70 43 73 72 2d 3e 69 43 65 6c  Cell; pCsr->iCel
93f0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  l++){.        as
9400: 73 65 72 74 28 20 70 43 73 72 2d 3e 70 4e 6f 64  sert( pCsr->pNod
9410: 65 3d 3d 70 52 6f 6f 74 20 29 3b 0a 20 20 20 20  e==pRoot );.    
9420: 20 20 20 20 72 63 20 3d 20 64 65 73 63 65 6e 64      rc = descend
9430: 54 6f 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70  ToCell(pRtree, p
9440: 43 73 72 2c 20 70 52 74 72 65 65 2d 3e 69 44 65  Csr, pRtree->iDe
9450: 70 74 68 2c 20 26 69 73 45 6f 66 29 3b 0a 20 20  pth, &isEof);.  
9460: 20 20 20 20 20 20 69 66 28 20 21 69 73 45 6f 66        if( !isEof
9470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
9480: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
94a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
94b0: 26 20 69 73 45 6f 66 20 29 7b 0a 20 20 20 20 20  & isEof ){.     
94c0: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
94d0: 3e 70 4e 6f 64 65 3d 3d 70 52 6f 6f 74 20 29 3b  >pNode==pRoot );
94e0: 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 6c  .        nodeRel
94f0: 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f  ease(pRtree, pRo
9500: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  ot);.        pCs
9510: 72 2d 3e 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  r->pNode = 0;.  
9520: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9530: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9540: 4b 20 7c 7c 20 21 70 43 73 72 2d 3e 70 4e 6f 64  K || !pCsr->pNod
9550: 65 20 7c 7c 20 70 43 73 72 2d 3e 69 43 65 6c 6c  e || pCsr->iCell
9560: 3c 4e 43 45 4c 4c 28 70 43 73 72 2d 3e 70 4e 6f  <NCELL(pCsr->pNo
9570: 64 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  de) );.    }.  }
9580: 0a 0a 20 20 72 74 72 65 65 52 65 6c 65 61 73 65  ..  rtreeRelease
9590: 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75  (pRtree);.  retu
95a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
95b0: 53 65 74 20 74 68 65 20 70 49 64 78 49 6e 66 6f  Set the pIdxInfo
95c0: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
95d0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6e 52 6f 77  variable to nRow
95e0: 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 0a 2a 2a  . Unless this.**
95f0: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 75   extension is cu
9600: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
9610: 65 64 20 62 79 20 61 20 76 65 72 73 69 6f 6e 20  ed by a version 
9620: 6f 66 20 53 51 4c 69 74 65 20 74 6f 6f 20 6f 6c  of SQLite too ol
9630: 64 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72 74 20  d to.** support 
9640: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 2e 20 49  estimatedRows. I
9650: 6e 20 74 68 61 74 20 63 61 73 65 20 74 68 69 73  n that case this
9660: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9670: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9680: 76 6f 69 64 20 73 65 74 45 73 74 69 6d 61 74 65  void setEstimate
9690: 64 52 6f 77 73 28 73 71 6c 69 74 65 33 5f 69 6e  dRows(sqlite3_in
96a0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
96b0: 66 6f 2c 20 69 36 34 20 6e 52 6f 77 29 7b 0a 23  fo, i64 nRow){.#
96c0: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
96d0: 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 38 30 30  N_NUMBER>=300800
96e0: 32 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  2.  if( sqlite3_
96f0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
9700: 72 28 29 3e 3d 33 30 30 38 30 30 32 20 29 7b 0a  r()>=3008002 ){.
9710: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
9720: 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52  timatedRows = nR
9730: 6f 77 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ow;.  }.#endif.}
9740: 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65 20 76 69  ../*.** Rtree vi
9750: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
9760: 6c 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  le xBestIndex me
9770: 74 68 6f 64 2e 20 54 68 65 72 65 20 61 72 65 20  thod. There are 
9780: 74 68 72 65 65 0a 2a 2a 20 74 61 62 6c 65 20 73  three.** table s
9790: 63 61 6e 20 73 74 72 61 74 65 67 69 65 73 20 74  can strategies t
97a0: 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 20 28 69  o choose from (i
97b0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6d 6f 73  n order from mos
97c0: 74 20 74 6f 20 0a 2a 2a 20 6c 65 61 73 74 20 64  t to .** least d
97d0: 65 73 69 72 61 62 6c 65 29 3a 0a 2a 2a 0a 2a 2a  esirable):.**.**
97e0: 20 20 20 69 64 78 4e 75 6d 20 20 20 20 20 69 64     idxNum     id
97f0: 78 53 74 72 20 20 20 20 20 20 20 20 53 74 72 61  xStr        Stra
9800: 74 65 67 79 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  tegy.**   ------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
9840: 20 20 31 20 20 20 20 20 20 20 20 55 6e 75 73 65    1        Unuse
9850: 64 20 20 20 20 20 20 20 20 44 69 72 65 63 74 20  d        Direct 
9860: 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 2e  lookup by rowid.
9870: 0a 2a 2a 20 20 20 20 20 32 20 20 20 20 20 20 20  .**     2       
9880: 20 53 65 65 20 62 65 6c 6f 77 20 20 20 20 20 52   See below     R
9890: 2d 74 72 65 65 20 71 75 65 72 79 20 6f 72 20 66  -tree query or f
98a0: 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a  ull-table scan..
98b0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  -----.**.** If s
98f0: 74 72 61 74 65 67 79 20 31 20 69 73 20 75 73 65  trategy 1 is use
9900: 64 2c 20 74 68 65 6e 20 69 64 78 53 74 72 20 69  d, then idxStr i
9910: 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66 75 6c  s not meaningful
9920: 2e 20 49 66 20 73 74 72 61 74 65 67 79 0a 2a 2a  . If strategy.**
9930: 20 32 20 69 73 20 75 73 65 64 2c 20 69 64 78 53   2 is used, idxS
9940: 74 72 20 69 73 20 66 6f 72 6d 61 74 74 65 64 20  tr is formatted 
9950: 74 6f 20 63 6f 6e 74 61 69 6e 20 32 20 62 79 74  to contain 2 byt
9960: 65 73 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  es for each .** 
9970: 63 6f 6e 73 74 72 61 69 6e 74 20 75 73 65 64 2e  constraint used.
9980: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   The first two b
9990: 79 74 65 73 20 6f 66 20 69 64 78 53 74 72 20 63  ytes of idxStr c
99a0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 0a 2a 2a  orrespond to .**
99b0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
99c0: 69 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  in sqlite3_index
99d0: 5f 69 6e 66 6f 2e 61 43 6f 6e 73 74 72 61 69 6e  _info.aConstrain
99e0: 74 55 73 61 67 65 5b 5d 20 77 69 74 68 0a 2a 2a  tUsage[] with.**
99f0: 20 28 61 72 67 76 49 6e 64 65 78 3d 3d 31 29 20   (argvIndex==1) 
9a00: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  etc..**.** The f
9a10: 69 72 73 74 20 6f 66 20 65 61 63 68 20 70 61 69  irst of each pai
9a20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 64  r of bytes in id
9a30: 78 53 74 72 20 69 64 65 6e 74 69 66 69 65 73 20  xStr identifies 
9a40: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  the constraint.*
9a50: 2a 20 6f 70 65 72 61 74 6f 72 20 61 73 20 66 6f  * operator as fo
9a60: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
9a70: 70 65 72 61 74 6f 72 20 20 20 20 42 79 74 65 20  perator    Byte 
9a80: 56 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  Value.**   -----
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9aa0: 2d 0a 2a 2a 20 20 20 20 20 20 3d 20 20 20 20 20  -.**      =     
9ab0: 20 20 20 30 78 34 31 20 28 27 41 27 29 0a 2a 2a     0x41 ('A').**
9ac0: 20 20 20 20 20 3c 3d 20 20 20 20 20 20 20 20 30       <=        0
9ad0: 78 34 32 20 28 27 42 27 29 0a 2a 2a 20 20 20 20  x42 ('B').**    
9ae0: 20 20 3c 20 20 20 20 20 20 20 20 30 78 34 33 20    <        0x43 
9af0: 28 27 43 27 29 0a 2a 2a 20 20 20 20 20 3e 3d 20  ('C').**     >= 
9b00: 20 20 20 20 20 20 20 30 78 34 34 20 28 27 44 27         0x44 ('D'
9b10: 29 0a 2a 2a 20 20 20 20 20 20 3e 20 20 20 20 20  ).**      >     
9b20: 20 20 20 30 78 34 35 20 28 27 45 27 29 0a 2a 2a     0x45 ('E').**
9b30: 20 20 20 4d 41 54 43 48 20 20 20 20 20 20 20 30     MATCH       0
9b40: 78 34 36 20 28 27 46 27 29 0a 2a 2a 20 20 20 2d  x46 ('F').**   -
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  -----.**.** The 
9b70: 73 65 63 6f 6e 64 20 6f 66 20 65 61 63 68 20 70  second of each p
9b80: 61 69 72 20 6f 66 20 62 79 74 65 73 20 69 64 65  air of bytes ide
9b90: 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f 6f 72  ntifies the coor
9ba0: 64 69 6e 61 74 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  dinate column.**
9bb0: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
9bc0: 6e 73 74 72 61 69 6e 74 20 61 70 70 6c 69 65 73  nstraint applies
9bd0: 2e 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63  . The leftmost c
9be0: 6f 6f 72 64 69 6e 61 74 65 20 63 6f 6c 75 6d 6e  oordinate column
9bf0: 0a 2a 2a 20 69 73 20 27 61 27 2c 20 74 68 65 20  .** is 'a', the 
9c00: 73 65 63 6f 6e 64 20 66 72 6f 6d 20 74 68 65 20  second from the 
9c10: 6c 65 66 74 20 27 62 27 20 65 74 63 2e 0a 2a 2f  left 'b' etc..*/
9c20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65  .static int rtre
9c30: 65 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  eBestIndex(sqlit
9c40: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
9c50: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
9c60: 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 52   *pIdxInfo){.  R
9c70: 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20 28  tree *pRtree = (
9c80: 52 74 72 65 65 2a 29 74 61 62 3b 0a 20 20 69 6e  Rtree*)tab;.  in
9c90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9ca0: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 36  ;.  int ii;.  i6
9cb0: 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 nRow;         
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cd0: 20 45 73 74 69 6d 61 74 65 64 20 72 6f 77 73 20   Estimated rows 
9ce0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
9cf0: 20 73 63 61 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20   scan */..  int 
9d00: 69 49 64 78 20 3d 20 30 3b 0a 20 20 63 68 61 72  iIdx = 0;.  char
9d10: 20 7a 49 64 78 53 74 72 5b 52 54 52 45 45 5f 4d   zIdxStr[RTREE_M
9d20: 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 38 2b  AX_DIMENSIONS*8+
9d30: 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 49 64  1];.  memset(zId
9d40: 78 53 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  xStr, 0, sizeof(
9d50: 7a 49 64 78 53 74 72 29 29 3b 0a 0a 20 20 61 73  zIdxStr));..  as
9d60: 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e  sert( pIdxInfo->
9d70: 69 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 66  idxStr==0 );.  f
9d80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78  or(ii=0; ii<pIdx
9d90: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
9da0: 74 20 26 26 20 69 49 64 78 3c 28 69 6e 74 29 28  t && iIdx<(int)(
9db0: 73 69 7a 65 6f 66 28 7a 49 64 78 53 74 72 29 2d  sizeof(zIdxStr)-
9dc0: 31 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  1); ii++){.    s
9dd0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
9de0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
9df0: 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e 61  p = &pIdxInfo->a
9e00: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b 0a  Constraint[ii];.
9e10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62  .    if( p->usab
9e20: 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
9e30: 3d 3d 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53 51  ==0 && p->op==SQ
9e40: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9e50: 52 41 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20  RAINT_EQ ){.    
9e60: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 6e 20    /* We have an 
9e70: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
9e80: 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
9e90: 2e 20 55 73 65 20 73 74 72 61 74 65 67 79 20 31  . Use strategy 1
9ea0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
9eb0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
9ec0: 30 3b 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b  0; jj<ii; jj++){
9ed0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
9ee0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
9ef0: 61 67 65 5b 6a 6a 5d 2e 61 72 67 76 49 6e 64 65  age[jj].argvInde
9f00: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x = 0;.        p
9f10: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
9f20: 61 69 6e 74 55 73 61 67 65 5b 6a 6a 5d 2e 6f 6d  aintUsage[jj].om
9f30: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
9f40: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
9f50: 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20  idxNum = 1;.    
9f60: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
9f70: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 69 5d  straintUsage[ii]
9f80: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a  .argvIndex = 1;.
9f90: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
9fa0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9fb0: 5b 6a 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 0a  [jj].omit = 1;..
9fc0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
9fd0: 72 61 74 65 67 79 20 69 6e 76 6f 6c 76 65 73 20  rategy involves 
9fe0: 61 20 74 77 6f 20 72 6f 77 69 64 20 6c 6f 6f 6b  a two rowid look
9ff0: 75 70 73 20 6f 6e 20 61 6e 20 42 2d 54 72 65 65  ups on an B-Tree
a000: 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 20 20   structures.    
a010: 20 20 2a 2a 20 61 6e 64 20 74 68 65 6e 20 61 20    ** and then a 
a020: 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20 6f 66  linear search of
a030: 20 61 6e 20 52 2d 54 72 65 65 20 6e 6f 64 65 2e   an R-Tree node.
a040: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
a050: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  .      ** consid
a060: 65 72 65 64 20 61 6c 6d 6f 73 74 20 61 73 20 71  ered almost as q
a070: 75 69 63 6b 20 61 73 20 61 20 64 69 72 65 63 74  uick as a direct
a080: 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 28 66   rowid lookup (f
a090: 6f 72 20 77 68 69 63 68 20 0a 20 20 20 20 20 20  or which .      
a0a0: 2a 2a 20 73 71 6c 69 74 65 20 75 73 65 73 20 61  ** sqlite uses a
a0b0: 6e 20 69 6e 74 65 72 6e 61 6c 20 63 6f 73 74 20  n internal cost 
a0c0: 6f 66 20 30 2e 30 29 2e 20 49 74 20 69 73 20 65  of 0.0). It is e
a0d0: 78 70 65 63 74 65 64 20 74 6f 20 72 65 74 75 72  xpected to retur
a0e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  n.      ** a sin
a0f0: 67 6c 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 2a  gle row..      *
a100: 2f 20 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  / .      pIdxInf
a110: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
a120: 20 3d 20 33 30 2e 30 3b 0a 20 20 20 20 20 20 73   = 30.0;.      s
a130: 65 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28  etEstimatedRows(
a140: 70 49 64 78 49 6e 66 6f 2c 20 31 29 3b 0a 20 20  pIdxInfo, 1);.  
a150: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a160: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
a170: 20 69 66 28 20 70 2d 3e 75 73 61 62 6c 65 20 26   if( p->usable &
a180: 26 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 30 20  & (p->iColumn>0 
a190: 7c 7c 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  || p->op==SQLITE
a1a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
a1b0: 54 5f 4d 41 54 43 48 29 20 29 7b 0a 20 20 20 20  T_MATCH) ){.    
a1c0: 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 20 20 73    u8 op;.      s
a1d0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
a1e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
a1f0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
a200: 41 49 4e 54 5f 45 51 3a 20 6f 70 20 3d 20 52 54  AINT_EQ: op = RT
a210: 52 45 45 5f 45 51 3b 20 62 72 65 61 6b 3b 0a 20  REE_EQ; break;. 
a220: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
a230: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
a240: 49 4e 54 5f 47 54 3a 20 6f 70 20 3d 20 52 54 52  INT_GT: op = RTR
a250: 45 45 5f 47 54 3b 20 62 72 65 61 6b 3b 0a 20 20  EE_GT; break;.  
a260: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a270: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
a280: 4e 54 5f 4c 45 3a 20 6f 70 20 3d 20 52 54 52 45  NT_LE: op = RTRE
a290: 45 5f 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20  E_LE; break;.   
a2a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a2b0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
a2c0: 54 5f 4c 54 3a 20 6f 70 20 3d 20 52 54 52 45 45  T_LT: op = RTREE
a2d0: 5f 4c 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _LT; break;.    
a2e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a2f0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
a300: 5f 47 45 3a 20 6f 70 20 3d 20 52 54 52 45 45 5f  _GE: op = RTREE_
a310: 47 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  GE; break;.     
a320: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
a330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a340: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
a350: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
a360: 43 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CH );.          
a370: 6f 70 20 3d 20 52 54 52 45 45 5f 4d 41 54 43 48  op = RTREE_MATCH
a380: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ; .          bre
a390: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a3a0: 20 20 7a 49 64 78 53 74 72 5b 69 49 64 78 2b 2b    zIdxStr[iIdx++
a3b0: 5d 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7a 49  ] = op;.      zI
a3c0: 64 78 53 74 72 5b 69 49 64 78 2b 2b 5d 20 3d 20  dxStr[iIdx++] = 
a3d0: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 31 20 2b  p->iColumn - 1 +
a3e0: 20 27 61 27 3b 0a 20 20 20 20 20 20 70 49 64 78   'a';.      pIdx
a3f0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
a400: 74 55 73 61 67 65 5b 69 69 5d 2e 61 72 67 76 49  tUsage[ii].argvI
a410: 6e 64 65 78 20 3d 20 28 69 49 64 78 2f 32 29 3b  ndex = (iIdx/2);
a420: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
a430: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
a440: 65 5b 69 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  e[ii].omit = 1;.
a450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 64      }.  }..  pId
a460: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
a470: 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  2;.  pIdxInfo->n
a480: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
a490: 3d 20 31 3b 0a 20 20 69 66 28 20 69 49 64 78 3e  = 1;.  if( iIdx>
a4a0: 30 20 26 26 20 30 3d 3d 28 70 49 64 78 49 6e 66  0 && 0==(pIdxInf
a4b0: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 73 71 6c 69  o->idxStr = sqli
a4c0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
a4d0: 2c 20 7a 49 64 78 53 74 72 29 29 20 29 7b 0a 20  , zIdxStr)) ){. 
a4e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a4f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 6e  _NOMEM;.  }..  n
a500: 52 6f 77 20 3d 20 70 52 74 72 65 65 2d 3e 6e 52  Row = pRtree->nR
a510: 6f 77 45 73 74 20 2f 20 28 69 49 64 78 20 2b 20  owEst / (iIdx + 
a520: 31 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  1);.  pIdxInfo->
a530: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
a540: 28 64 6f 75 62 6c 65 29 36 2e 30 20 2a 20 28 64  (double)6.0 * (d
a550: 6f 75 62 6c 65 29 6e 52 6f 77 3b 0a 20 20 73 65  ouble)nRow;.  se
a560: 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28 70  tEstimatedRows(p
a570: 49 64 78 49 6e 66 6f 2c 20 6e 52 6f 77 29 3b 0a  IdxInfo, nRow);.
a580: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a5a0: 65 20 4e 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20  e N-dimensional 
a5b0: 76 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 65  volumn of the ce
a5c0: 6c 6c 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 2e  ll stored in *p.
a5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72 65 65  .*/.static Rtree
a5e0: 44 56 61 6c 75 65 20 63 65 6c 6c 41 72 65 61 28  DValue cellArea(
a5f0: 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52  Rtree *pRtree, R
a600: 74 72 65 65 43 65 6c 6c 20 2a 70 29 7b 0a 20 20  treeCell *p){.  
a610: 52 74 72 65 65 44 56 61 6c 75 65 20 61 72 65 61  RtreeDValue area
a620: 20 3d 20 28 52 74 72 65 65 44 56 61 6c 75 65 29   = (RtreeDValue)
a630: 31 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  1;.  int ii;.  f
a640: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74  or(ii=0; ii<(pRt
a650: 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69  ree->nDim*2); ii
a660: 2b 3d 32 29 7b 0a 20 20 20 20 61 72 65 61 20 3d  +=2){.    area =
a670: 20 28 61 72 65 61 20 2a 20 28 44 43 4f 4f 52 44   (area * (DCOORD
a680: 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d  (p->aCoord[ii+1]
a690: 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e 61 43  ) - DCOORD(p->aC
a6a0: 6f 6f 72 64 5b 69 69 5d 29 29 29 3b 0a 20 20 7d  oord[ii])));.  }
a6b0: 0a 20 20 72 65 74 75 72 6e 20 61 72 65 61 3b 0a  .  return area;.
a6c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a6d0: 74 68 65 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74  the margin lengt
a6e0: 68 20 6f 66 20 63 65 6c 6c 20 70 2e 20 54 68 65  h of cell p. The
a6f0: 20 6d 61 72 67 69 6e 20 6c 65 6e 67 74 68 20 69   margin length i
a700: 73 20 74 68 65 20 73 75 6d 0a 2a 2a 20 6f 66 20  s the sum.** of 
a710: 74 68 65 20 6f 62 6a 65 63 74 73 20 73 69 7a 65  the objects size
a720: 20 69 6e 20 65 61 63 68 20 64 69 6d 65 6e 73 69   in each dimensi
a730: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74  on..*/.static Rt
a740: 72 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 4d 61  reeDValue cellMa
a750: 72 67 69 6e 28 52 74 72 65 65 20 2a 70 52 74 72  rgin(Rtree *pRtr
a760: 65 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70  ee, RtreeCell *p
a770: 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  ){.  RtreeDValue
a780: 20 6d 61 72 67 69 6e 20 3d 20 28 52 74 72 65 65   margin = (Rtree
a790: 44 56 61 6c 75 65 29 30 3b 0a 20 20 69 6e 74 20  DValue)0;.  int 
a7a0: 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  ii;.  for(ii=0; 
a7b0: 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ii<(pRtree->nDim
a7c0: 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20  *2); ii+=2){.   
a7d0: 20 6d 61 72 67 69 6e 20 2b 3d 20 28 44 43 4f 4f   margin += (DCOO
a7e0: 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b  RD(p->aCoord[ii+
a7f0: 31 5d 29 20 2d 20 44 43 4f 4f 52 44 28 70 2d 3e  1]) - DCOORD(p->
a800: 61 43 6f 6f 72 64 5b 69 69 5d 29 29 3b 0a 20 20  aCoord[ii]));.  
a810: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 72 67 69  }.  return margi
a820: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72  n;.}../*.** Stor
a830: 65 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 63  e the union of c
a840: 65 6c 6c 73 20 70 31 20 61 6e 64 20 70 32 20 69  ells p1 and p2 i
a850: 6e 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n p1..*/.static 
a860: 76 6f 69 64 20 63 65 6c 6c 55 6e 69 6f 6e 28 52  void cellUnion(R
a870: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
a880: 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
a890: 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
a8a0: 6e 74 20 69 69 3b 0a 20 20 69 66 28 20 70 52 74  nt ii;.  if( pRt
a8b0: 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79 70 65 3d  ree->eCoordType=
a8c0: 3d 52 54 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41  =RTREE_COORD_REA
a8d0: 4c 33 32 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  L32 ){.    for(i
a8e0: 69 3d 30 3b 20 69 69 3c 28 70 52 74 72 65 65 2d  i=0; ii<(pRtree-
a8f0: 3e 6e 44 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29  >nDim*2); ii+=2)
a900: 7b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43 6f 6f  {.      p1->aCoo
a910: 72 64 5b 69 69 5d 2e 66 20 3d 20 4d 49 4e 28 70  rd[ii].f = MIN(p
a920: 31 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66 2c  1->aCoord[ii].f,
a930: 20 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69 5d 2e   p2->aCoord[ii].
a940: 66 29 3b 0a 20 20 20 20 20 20 70 31 2d 3e 61 43  f);.      p1->aC
a950: 6f 6f 72 64 5b 69 69 2b 31 5d 2e 66 20 3d 20 4d  oord[ii+1].f = M
a960: 41 58 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  AX(p1->aCoord[ii
a970: 2b 31 5d 2e 66 2c 20 70 32 2d 3e 61 43 6f 6f 72  +1].f, p2->aCoor
a980: 64 5b 69 69 2b 31 5d 2e 66 29 3b 0a 20 20 20 20  d[ii+1].f);.    
a990: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
a9a0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52 74  or(ii=0; ii<(pRt
a9b0: 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69 69  ree->nDim*2); ii
a9c0: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 70 31 2d 3e  +=2){.      p1->
a9d0: 61 43 6f 6f 72 64 5b 69 69 5d 2e 69 20 3d 20 4d  aCoord[ii].i = M
a9e0: 49 4e 28 70 31 2d 3e 61 43 6f 6f 72 64 5b 69 69  IN(p1->aCoord[ii
a9f0: 5d 2e 69 2c 20 70 32 2d 3e 61 43 6f 6f 72 64 5b  ].i, p2->aCoord[
aa00: 69 69 5d 2e 69 29 3b 0a 20 20 20 20 20 20 70 31  ii].i);.      p1
aa10: 2d 3e 61 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69  ->aCoord[ii+1].i
aa20: 20 3d 20 4d 41 58 28 70 31 2d 3e 61 43 6f 6f 72   = MAX(p1->aCoor
aa30: 64 5b 69 69 2b 31 5d 2e 69 2c 20 70 32 2d 3e 61  d[ii+1].i, p2->a
aa40: 43 6f 6f 72 64 5b 69 69 2b 31 5d 2e 69 29 3b 0a  Coord[ii+1].i);.
aa50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
aa60: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aa70: 66 20 74 68 65 20 61 72 65 61 20 63 6f 76 65 72  f the area cover
aa80: 65 64 20 62 79 20 70 32 20 69 73 20 61 20 73 75  ed by p2 is a su
aa90: 62 73 65 74 20 6f 66 20 74 68 65 20 61 72 65 61  bset of the area
aaa0: 20 63 6f 76 65 72 65 64 0a 2a 2a 20 62 79 20 70   covered.** by p
aab0: 31 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  1. False otherwi
aac0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
aad0: 74 20 63 65 6c 6c 43 6f 6e 74 61 69 6e 73 28 52  t cellContains(R
aae0: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 52 74  tree *pRtree, Rt
aaf0: 72 65 65 43 65 6c 6c 20 2a 70 31 2c 20 52 74 72  reeCell *p1, Rtr
ab00: 65 65 43 65 6c 6c 20 2a 70 32 29 7b 0a 20 20 69  eeCell *p2){.  i
ab10: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 69 73 49  nt ii;.  int isI
ab20: 6e 74 20 3d 20 28 70 52 74 72 65 65 2d 3e 65 43  nt = (pRtree->eC
ab30: 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45 45 5f  oordType==RTREE_
ab40: 43 4f 4f 52 44 5f 49 4e 54 33 32 29 3b 0a 20 20  COORD_INT32);.  
ab50: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 28 70 52  for(ii=0; ii<(pR
ab60: 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20 69  tree->nDim*2); i
ab70: 69 2b 3d 32 29 7b 0a 20 20 20 20 52 74 72 65 65  i+=2){.    Rtree
ab80: 43 6f 6f 72 64 20 2a 61 31 20 3d 20 26 70 31 2d  Coord *a1 = &p1-
ab90: 3e 61 43 6f 6f 72 64 5b 69 69 5d 3b 0a 20 20 20  >aCoord[ii];.   
aba0: 20 52 74 72 65 65 43 6f 6f 72 64 20 2a 61 32 20   RtreeCoord *a2 
abb0: 3d 20 26 70 32 2d 3e 61 43 6f 6f 72 64 5b 69 69  = &p2->aCoord[ii
abc0: 5d 3b 0a 20 20 20 20 69 66 28 20 28 21 69 73 49  ];.    if( (!isI
abd0: 6e 74 20 26 26 20 28 61 32 5b 30 5d 2e 66 3c 61  nt && (a2[0].f<a
abe0: 31 5b 30 5d 2e 66 20 7c 7c 20 61 32 5b 31 5d 2e  1[0].f || a2[1].
abf0: 66 3e 61 31 5b 31 5d 2e 66 29 29 20 0a 20 20 20  f>a1[1].f)) .   
ac00: 20 20 7c 7c 20 28 20 69 73 49 6e 74 20 26 26 20    || ( isInt && 
ac10: 28 61 32 5b 30 5d 2e 69 3c 61 31 5b 30 5d 2e 69  (a2[0].i<a1[0].i
ac20: 20 7c 7c 20 61 32 5b 31 5d 2e 69 3e 61 31 5b 31   || a2[1].i>a1[1
ac30: 5d 2e 69 29 29 20 0a 20 20 20 20 29 7b 0a 20 20  ].i)) .    ){.  
ac40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ac50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ac60: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
ac70: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 63  urn the amount c
ac80: 65 6c 6c 20 70 20 77 6f 75 6c 64 20 67 72 6f 77  ell p would grow
ac90: 20 62 79 20 69 66 20 69 74 20 77 65 72 65 20 75   by if it were u
aca0: 6e 69 6f 6e 65 64 20 77 69 74 68 20 70 43 65 6c  nioned with pCel
acb0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 74 72  l..*/.static Rtr
acc0: 65 65 44 56 61 6c 75 65 20 63 65 6c 6c 47 72 6f  eeDValue cellGro
acd0: 77 74 68 28 52 74 72 65 65 20 2a 70 52 74 72 65  wth(Rtree *pRtre
ace0: 65 2c 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 2c  e, RtreeCell *p,
acf0: 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c   RtreeCell *pCel
ad00: 6c 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c 75  l){.  RtreeDValu
ad10: 65 20 61 72 65 61 3b 0a 20 20 52 74 72 65 65 43  e area;.  RtreeC
ad20: 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 6d 65 6d 63  ell cell;.  memc
ad30: 70 79 28 26 63 65 6c 6c 2c 20 70 2c 20 73 69 7a  py(&cell, p, siz
ad40: 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29 29 3b  eof(RtreeCell));
ad50: 0a 20 20 61 72 65 61 20 3d 20 63 65 6c 6c 41 72  .  area = cellAr
ad60: 65 61 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c  ea(pRtree, &cell
ad70: 29 3b 0a 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70  );.  cellUnion(p
ad80: 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43  Rtree, &cell, pC
ad90: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ell);.  return (
ada0: 63 65 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c  cellArea(pRtree,
adb0: 20 26 63 65 6c 6c 29 2d 61 72 65 61 29 3b 0a 7d   &cell)-area);.}
adc0: 0a 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53  ..#if VARIANT_RS
add0: 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53 55  TARTREE_CHOOSESU
ade0: 42 54 52 45 45 20 7c 7c 20 56 41 52 49 41 4e 54  BTREE || VARIANT
adf0: 5f 52 53 54 41 52 54 52 45 45 5f 53 50 4c 49 54  _RSTARTREE_SPLIT
ae00: 0a 73 74 61 74 69 63 20 52 74 72 65 65 44 56 61  .static RtreeDVa
ae10: 6c 75 65 20 63 65 6c 6c 4f 76 65 72 6c 61 70 28  lue cellOverlap(
ae20: 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
ae30: 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  , .  RtreeCell *
ae40: 70 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  p, .  RtreeCell 
ae50: 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e  *aCell, .  int n
ae60: 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69 45 78  Cell, .  int iEx
ae70: 63 6c 75 64 65 0a 29 7b 0a 20 20 69 6e 74 20 69  clude.){.  int i
ae80: 69 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  i;.  RtreeDValue
ae90: 20 6f 76 65 72 6c 61 70 20 3d 20 30 2e 30 3b 0a   overlap = 0.0;.
aea0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
aeb0: 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 23 69 66  Cell; ii++){.#if
aec0: 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52 54 52   VARIANT_RSTARTR
aed0: 45 45 5f 43 48 4f 4f 53 45 53 55 42 54 52 45 45  EE_CHOOSESUBTREE
aee0: 0a 20 20 20 20 69 66 28 20 69 69 21 3d 69 45 78  .    if( ii!=iEx
aef0: 63 6c 75 64 65 20 29 0a 23 65 6c 73 65 0a 20 20  clude ).#else.  
af00: 20 20 61 73 73 65 72 74 28 20 69 45 78 63 6c 75    assert( iExclu
af10: 64 65 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 55 4e  de==-1 );.    UN
af20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
af30: 45 78 63 6c 75 64 65 29 3b 0a 23 65 6e 64 69 66  Exclude);.#endif
af40: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
af50: 20 6a 6a 3b 0a 20 20 20 20 20 20 52 74 72 65 65   jj;.      Rtree
af60: 44 56 61 6c 75 65 20 6f 20 3d 20 28 52 74 72 65  DValue o = (Rtre
af70: 65 44 56 61 6c 75 65 29 31 3b 0a 20 20 20 20 20  eDValue)1;.     
af80: 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 28 70   for(jj=0; jj<(p
af90: 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32 29 3b 20  Rtree->nDim*2); 
afa0: 6a 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  jj+=2){.        
afb0: 52 74 72 65 65 44 56 61 6c 75 65 20 78 31 2c 20  RtreeDValue x1, 
afc0: 78 32 3b 0a 0a 20 20 20 20 20 20 20 20 78 31 20  x2;..        x1 
afd0: 3d 20 4d 41 58 28 44 43 4f 4f 52 44 28 70 2d 3e  = MAX(DCOORD(p->
afe0: 61 43 6f 6f 72 64 5b 6a 6a 5d 29 2c 20 44 43 4f  aCoord[jj]), DCO
aff0: 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43  ORD(aCell[ii].aC
b000: 6f 6f 72 64 5b 6a 6a 5d 29 29 3b 0a 20 20 20 20  oord[jj]));.    
b010: 20 20 20 20 78 32 20 3d 20 4d 49 4e 28 44 43 4f      x2 = MIN(DCO
b020: 4f 52 44 28 70 2d 3e 61 43 6f 6f 72 64 5b 6a 6a  ORD(p->aCoord[jj
b030: 2b 31 5d 29 2c 20 44 43 4f 4f 52 44 28 61 43 65  +1]), DCOORD(aCe
b040: 6c 6c 5b 69 69 5d 2e 61 43 6f 6f 72 64 5b 6a 6a  ll[ii].aCoord[jj
b050: 2b 31 5d 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  +1]));..        
b060: 69 66 28 20 78 32 3c 78 31 20 29 7b 0a 20 20 20  if( x2<x1 ){.   
b070: 20 20 20 20 20 20 20 6f 20 3d 20 30 2e 30 3b 0a         o = 0.0;.
b080: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b090: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b0a0: 20 20 20 20 20 20 20 20 20 20 6f 20 3d 20 6f 20            o = o 
b0b0: 2a 20 28 78 32 2d 78 31 29 3b 0a 20 20 20 20 20  * (x2-x1);.     
b0c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b0d0: 20 20 20 6f 76 65 72 6c 61 70 20 2b 3d 20 6f 3b     overlap += o;
b0e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b0f0: 75 72 6e 20 6f 76 65 72 6c 61 70 3b 0a 7d 0a 23  urn overlap;.}.#
b100: 65 6e 64 69 66 0a 0a 23 69 66 20 56 41 52 49 41  endif..#if VARIA
b110: 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48 4f  NT_RSTARTREE_CHO
b120: 4f 53 45 53 55 42 54 52 45 45 0a 73 74 61 74 69  OSESUBTREE.stati
b130: 63 20 52 74 72 65 65 44 56 61 6c 75 65 20 63 65  c RtreeDValue ce
b140: 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c 61 72 67 65  llOverlapEnlarge
b150: 6d 65 6e 74 28 0a 20 20 52 74 72 65 65 20 2a 70  ment(.  Rtree *p
b160: 52 74 72 65 65 2c 20 0a 20 20 52 74 72 65 65 43  Rtree, .  RtreeC
b170: 65 6c 6c 20 2a 70 2c 20 0a 20 20 52 74 72 65 65  ell *p, .  Rtree
b180: 43 65 6c 6c 20 2a 70 49 6e 73 65 72 74 2c 20 0a  Cell *pInsert, .
b190: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
b1a0: 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ll, .  int nCell
b1b0: 2c 20 0a 20 20 69 6e 74 20 69 45 78 63 6c 75 64  , .  int iExclud
b1c0: 65 0a 29 7b 0a 20 20 52 74 72 65 65 44 56 61 6c  e.){.  RtreeDVal
b1d0: 75 65 20 62 65 66 6f 72 65 2c 20 61 66 74 65 72  ue before, after
b1e0: 3b 0a 20 20 62 65 66 6f 72 65 20 3d 20 63 65 6c  ;.  before = cel
b1f0: 6c 4f 76 65 72 6c 61 70 28 70 52 74 72 65 65 2c  lOverlap(pRtree,
b200: 20 70 2c 20 61 43 65 6c 6c 2c 20 6e 43 65 6c 6c   p, aCell, nCell
b210: 2c 20 69 45 78 63 6c 75 64 65 29 3b 0a 20 20 63  , iExclude);.  c
b220: 65 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c  ellUnion(pRtree,
b230: 20 70 2c 20 70 49 6e 73 65 72 74 29 3b 0a 20 20   p, pInsert);.  
b240: 61 66 74 65 72 20 3d 20 63 65 6c 6c 4f 76 65 72  after = cellOver
b250: 6c 61 70 28 70 52 74 72 65 65 2c 20 70 2c 20 61  lap(pRtree, p, a
b260: 43 65 6c 6c 2c 20 6e 43 65 6c 6c 2c 20 69 45 78  Cell, nCell, iEx
b270: 63 6c 75 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  clude);.  return
b280: 20 28 61 66 74 65 72 2d 62 65 66 6f 72 65 29 3b   (after-before);
b290: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
b2a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b2b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
b2c0: 68 6f 6f 73 65 4c 65 61 66 20 61 6c 67 6f 72 69  hooseLeaf algori
b2d0: 74 68 6d 20 66 72 6f 6d 20 47 75 74 6d 61 6e 5b  thm from Gutman[
b2e0: 38 34 5d 2e 0a 2a 2a 20 43 68 6f 6f 73 65 53 75  84]..** ChooseSu
b2f0: 62 54 72 65 65 20 69 6e 20 72 2a 74 72 65 65 20  bTree in r*tree 
b300: 74 65 72 6d 69 6e 6f 6c 6f 67 79 2e 0a 2a 2f 0a  terminology..*/.
b310: 73 74 61 74 69 63 20 69 6e 74 20 43 68 6f 6f 73  static int Choos
b320: 65 4c 65 61 66 28 0a 20 20 52 74 72 65 65 20 2a  eLeaf(.  Rtree *
b330: 70 52 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pRtree,         
b340: 20 20 20 20 20 20 2f 2a 20 52 74 72 65 65 20 74        /* Rtree t
b350: 61 62 6c 65 20 2a 2f 0a 20 20 52 74 72 65 65 43  able */.  RtreeC
b360: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  ell *pCell,     
b370: 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 74         /* Cell t
b380: 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 72 74  o insert into rt
b390: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65  ree */.  int iHe
b3a0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
b3b0: 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
b3c0: 6f 66 20 73 75 62 2d 74 72 65 65 20 72 6f 6f 74  of sub-tree root
b3d0: 65 64 20 61 74 20 70 43 65 6c 6c 20 2a 2f 0a 20  ed at pCell */. 
b3e0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 2a 70 70 4c   RtreeNode **ppL
b3f0: 65 61 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf           /*
b400: 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20 6c   OUT: Selected l
b410: 65 61 66 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  eaf page */.){. 
b420: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
b430: 69 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  i;.  RtreeNode *
b440: 70 4e 6f 64 65 3b 0a 20 20 72 63 20 3d 20 6e 6f  pNode;.  rc = no
b450: 64 65 41 63 71 75 69 72 65 28 70 52 74 72 65 65  deAcquire(pRtree
b460: 2c 20 31 2c 20 30 2c 20 26 70 4e 6f 64 65 29 3b  , 1, 0, &pNode);
b470: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63  ..  for(ii=0; rc
b480: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b490: 69 3c 28 70 52 74 72 65 65 2d 3e 69 44 65 70 74  i<(pRtree->iDept
b4a0: 68 2d 69 48 65 69 67 68 74 29 3b 20 69 69 2b 2b  h-iHeight); ii++
b4b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  ){.    int iCell
b4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
b4d0: 74 36 34 20 69 42 65 73 74 20 3d 20 30 3b 0a 0a  t64 iBest = 0;..
b4e0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
b4f0: 66 4d 69 6e 47 72 6f 77 74 68 20 3d 20 30 2e 30  fMinGrowth = 0.0
b500: 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75  ;.    RtreeDValu
b510: 65 20 66 4d 69 6e 41 72 65 61 20 3d 20 30 2e 30  e fMinArea = 0.0
b520: 3b 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53  ;.#if VARIANT_RS
b530: 54 41 52 54 52 45 45 5f 43 48 4f 4f 53 45 53 55  TARTREE_CHOOSESU
b540: 42 54 52 45 45 0a 20 20 20 20 52 74 72 65 65 44  BTREE.    RtreeD
b550: 56 61 6c 75 65 20 66 4d 69 6e 4f 76 65 72 6c 61  Value fMinOverla
b560: 70 20 3d 20 30 2e 30 3b 0a 20 20 20 20 52 74 72  p = 0.0;.    Rtr
b570: 65 65 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70  eeDValue overlap
b580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 6e  ;.#endif..    in
b590: 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
b5a0: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 52 74 72 65  pNode);.    Rtre
b5b0: 65 43 65 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20  eCell cell;.    
b5c0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c  RtreeNode *pChil
b5d0: 64 3b 0a 0a 20 20 20 20 52 74 72 65 65 43 65 6c  d;..    RtreeCel
b5e0: 6c 20 2a 61 43 65 6c 6c 20 3d 20 30 3b 0a 0a 23  l *aCell = 0;..#
b5f0: 69 66 20 56 41 52 49 41 4e 54 5f 52 53 54 41 52  if VARIANT_RSTAR
b600: 54 52 45 45 5f 43 48 4f 4f 53 45 53 55 42 54 52  TREE_CHOOSESUBTR
b610: 45 45 0a 20 20 20 20 69 66 28 20 69 69 3d 3d 28  EE.    if( ii==(
b620: 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 31  pRtree->iDepth-1
b630: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ) ){.      int j
b640: 6a 3b 0a 20 20 20 20 20 20 61 43 65 6c 6c 20 3d  j;.      aCell =
b650: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
b660: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c  sizeof(RtreeCell
b670: 29 2a 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  )*nCell);.      
b680: 69 66 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20  if( !aCell ){.  
b690: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b6a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
b6b0: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
b6c0: 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
b6d0: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 30 3b 0a       pNode = 0;.
b6e0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
b6f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b700: 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 43 65  for(jj=0; jj<nCe
b710: 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ll; jj++){.     
b720: 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 70     nodeGetCell(p
b730: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 6a 6a  Rtree, pNode, jj
b740: 2c 20 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a 20  , &aCell[jj]);. 
b750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
b760: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  dif..    /* Sele
b770: 63 74 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  ct the child nod
b780: 65 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20  e which will be 
b790: 65 6e 6c 61 72 67 65 64 20 74 68 65 20 6c 65 61  enlarged the lea
b7a0: 73 74 20 69 66 20 70 43 65 6c 6c 0a 20 20 20 20  st if pCell.    
b7b0: 2a 2a 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  ** is inserted i
b7c0: 6e 74 6f 20 69 74 2e 20 52 65 73 6f 6c 76 65 20  nto it. Resolve 
b7d0: 74 69 65 73 20 62 79 20 63 68 6f 6f 73 69 6e 67  ties by choosing
b7e0: 20 74 68 65 20 65 6e 74 72 79 20 77 69 74 68 0a   the entry with.
b7f0: 20 20 20 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c      ** the small
b800: 65 73 74 20 61 72 65 61 2e 0a 20 20 20 20 2a 2f  est area..    */
b810: 0a 20 20 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30  .    for(iCell=0
b820: 3b 20 69 43 65 6c 6c 3c 6e 43 65 6c 6c 3b 20 69  ; iCell<nCell; i
b830: 43 65 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cell++){.      i
b840: 6e 74 20 62 42 65 73 74 20 3d 20 30 3b 0a 20 20  nt bBest = 0;.  
b850: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
b860: 67 72 6f 77 74 68 3b 0a 20 20 20 20 20 20 52 74  growth;.      Rt
b870: 72 65 65 44 56 61 6c 75 65 20 61 72 65 61 3b 0a  reeDValue area;.
b880: 20 20 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c        nodeGetCel
b890: 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c  l(pRtree, pNode,
b8a0: 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a   iCell, &cell);.
b8b0: 20 20 20 20 20 20 67 72 6f 77 74 68 20 3d 20 63        growth = c
b8c0: 65 6c 6c 47 72 6f 77 74 68 28 70 52 74 72 65 65  ellGrowth(pRtree
b8d0: 2c 20 26 63 65 6c 6c 2c 20 70 43 65 6c 6c 29 3b  , &cell, pCell);
b8e0: 0a 20 20 20 20 20 20 61 72 65 61 20 3d 20 63 65  .      area = ce
b8f0: 6c 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26  llArea(pRtree, &
b900: 63 65 6c 6c 29 3b 0a 0a 23 69 66 20 56 41 52 49  cell);..#if VARI
b910: 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f 43 48  ANT_RSTARTREE_CH
b920: 4f 4f 53 45 53 55 42 54 52 45 45 0a 20 20 20 20  OOSESUBTREE.    
b930: 20 20 69 66 28 20 69 69 3d 3d 28 70 52 74 72 65    if( ii==(pRtre
b940: 65 2d 3e 69 44 65 70 74 68 2d 31 29 20 29 7b 0a  e->iDepth-1) ){.
b950: 20 20 20 20 20 20 20 20 6f 76 65 72 6c 61 70 20          overlap 
b960: 3d 20 63 65 6c 6c 4f 76 65 72 6c 61 70 45 6e 6c  = cellOverlapEnl
b970: 61 72 67 65 6d 65 6e 74 28 70 52 74 72 65 65 2c  argement(pRtree,
b980: 26 63 65 6c 6c 2c 70 43 65 6c 6c 2c 61 43 65 6c  &cell,pCell,aCel
b990: 6c 2c 6e 43 65 6c 6c 2c 69 43 65 6c 6c 29 3b 0a  l,nCell,iCell);.
b9a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9b0: 20 20 20 20 20 6f 76 65 72 6c 61 70 20 3d 20 30       overlap = 0
b9c0: 2e 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .0;.      }.    
b9d0: 20 20 69 66 28 20 28 69 43 65 6c 6c 3d 3d 30 29    if( (iCell==0)
b9e0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76 65   .       || (ove
b9f0: 72 6c 61 70 3c 66 4d 69 6e 4f 76 65 72 6c 61 70  rlap<fMinOverlap
ba00: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 76  ) .       || (ov
ba10: 65 72 6c 61 70 3d 3d 66 4d 69 6e 4f 76 65 72 6c  erlap==fMinOverl
ba20: 61 70 20 26 26 20 67 72 6f 77 74 68 3c 66 4d 69  ap && growth<fMi
ba30: 6e 47 72 6f 77 74 68 29 0a 20 20 20 20 20 20 20  nGrowth).       
ba40: 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d 66 4d 69  || (overlap==fMi
ba50: 6e 4f 76 65 72 6c 61 70 20 26 26 20 67 72 6f 77  nOverlap && grow
ba60: 74 68 3d 3d 66 4d 69 6e 47 72 6f 77 74 68 20 26  th==fMinGrowth &
ba70: 26 20 61 72 65 61 3c 66 4d 69 6e 41 72 65 61 29  & area<fMinArea)
ba80: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ba90: 20 20 62 42 65 73 74 20 3d 20 31 3b 0a 20 20 20    bBest = 1;.   
baa0: 20 20 20 20 20 66 4d 69 6e 4f 76 65 72 6c 61 70       fMinOverlap
bab0: 20 3d 20 6f 76 65 72 6c 61 70 3b 0a 20 20 20 20   = overlap;.    
bac0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
bad0: 69 66 28 20 69 43 65 6c 6c 3d 3d 30 7c 7c 67 72  if( iCell==0||gr
bae0: 6f 77 74 68 3c 66 4d 69 6e 47 72 6f 77 74 68 7c  owth<fMinGrowth|
baf0: 7c 28 67 72 6f 77 74 68 3d 3d 66 4d 69 6e 47 72  |(growth==fMinGr
bb00: 6f 77 74 68 20 26 26 20 61 72 65 61 3c 66 4d 69  owth && area<fMi
bb10: 6e 41 72 65 61 29 20 29 7b 0a 20 20 20 20 20 20  nArea) ){.      
bb20: 20 20 62 42 65 73 74 20 3d 20 31 3b 0a 20 20 20    bBest = 1;.   
bb30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
bb40: 20 20 69 66 28 20 62 42 65 73 74 20 29 7b 0a 20    if( bBest ){. 
bb50: 20 20 20 20 20 20 20 66 4d 69 6e 47 72 6f 77 74         fMinGrowt
bb60: 68 20 3d 20 67 72 6f 77 74 68 3b 0a 20 20 20 20  h = growth;.    
bb70: 20 20 20 20 66 4d 69 6e 41 72 65 61 20 3d 20 61      fMinArea = a
bb80: 72 65 61 3b 0a 20 20 20 20 20 20 20 20 69 42 65  rea;.        iBe
bb90: 73 74 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64  st = cell.iRowid
bba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bbc0: 65 28 61 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  e(aCell);.    rc
bbd0: 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70   = nodeAcquire(p
bbe0: 52 74 72 65 65 2c 20 69 42 65 73 74 2c 20 70 4e  Rtree, iBest, pN
bbf0: 6f 64 65 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  ode, &pChild);. 
bc00: 20 20 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70     nodeRelease(p
bc10: 52 74 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20  Rtree, pNode);. 
bc20: 20 20 20 70 4e 6f 64 65 20 3d 20 70 43 68 69 6c     pNode = pChil
bc30: 64 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4c 65 61  d;.  }..  *ppLea
bc40: 66 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 72 65 74  f = pNode;.  ret
bc50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bc60: 20 41 20 63 65 6c 6c 20 77 69 74 68 20 74 68 65   A cell with the
bc70: 20 73 61 6d 65 20 63 6f 6e 74 65 6e 74 20 61 73   same content as
bc80: 20 70 43 65 6c 6c 20 68 61 73 20 6a 75 73 74 20   pCell has just 
bc90: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
bca0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 6f 64 65 20 70  to.** the node p
bcb0: 4e 6f 64 65 2e 20 54 68 69 73 20 66 75 6e 63 74  Node. This funct
bcc0: 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
bcd0: 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 63 65 6c  bounding box cel
bce0: 6c 73 20 69 6e 0a 2a 2a 20 61 6c 6c 20 61 6e 63  ls in.** all anc
bcf0: 65 73 74 6f 72 20 65 6c 65 6d 65 6e 74 73 2e 0a  estor elements..
bd00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 41 64  */.static int Ad
bd10: 6a 75 73 74 54 72 65 65 28 0a 20 20 52 74 72 65  justTree(.  Rtre
bd20: 65 20 2a 70 52 74 72 65 65 2c 20 20 20 20 20 20  e *pRtree,      
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd40: 20 52 74 72 65 65 20 74 61 62 6c 65 20 2a 2f 0a   Rtree table */.
bd50: 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f    RtreeNode *pNo
bd60: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
bd70: 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 61 6e      /* Adjust an
bd80: 63 65 73 74 72 79 20 6f 66 20 74 68 69 73 20 6e  cestry of this n
bd90: 6f 64 65 2e 20 2a 2f 0a 20 20 52 74 72 65 65 43  ode. */.  RtreeC
bda0: 65 6c 6c 20 2a 70 43 65 6c 6c 20 20 20 20 20 20  ell *pCell      
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bdc0: 68 69 73 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  his cell was jus
bdd0: 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b  t inserted */.){
bde0: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 20  .  RtreeNode *p 
bdf0: 3d 20 70 4e 6f 64 65 3b 0a 20 20 77 68 69 6c 65  = pNode;.  while
be00: 28 20 70 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  ( p->pParent ){.
be10: 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70      RtreeNode *p
be20: 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 50 61 72  Parent = p->pPar
be30: 65 6e 74 3b 0a 20 20 20 20 52 74 72 65 65 43 65  ent;.    RtreeCe
be40: 6c 6c 20 63 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  ll cell;.    int
be50: 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20 69 66 28   iCell;..    if(
be60: 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64 65 78   nodeParentIndex
be70: 28 70 52 74 72 65 65 2c 20 70 2c 20 26 69 43 65  (pRtree, p, &iCe
be80: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
be90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bea0: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 0a  PT_VTAB;.    }..
beb0: 20 20 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28      nodeGetCell(
bec0: 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c  pRtree, pParent,
bed0: 20 69 43 65 6c 6c 2c 20 26 63 65 6c 6c 29 3b 0a   iCell, &cell);.
bee0: 20 20 20 20 69 66 28 20 21 63 65 6c 6c 43 6f 6e      if( !cellCon
bef0: 74 61 69 6e 73 28 70 52 74 72 65 65 2c 20 26 63  tains(pRtree, &c
bf00: 65 6c 6c 2c 20 70 43 65 6c 6c 29 20 29 7b 0a 20  ell, pCell) ){. 
bf10: 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e 28 70       cellUnion(p
bf20: 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 70 43  Rtree, &cell, pC
bf30: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 6e 6f 64 65  ell);.      node
bf40: 4f 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52  OverwriteCell(pR
bf50: 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26  tree, pParent, &
bf60: 63 65 6c 6c 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  cell, iCell);.  
bf70: 20 20 7d 0a 20 0a 20 20 20 20 70 20 3d 20 70 50    }. .    p = pP
bf80: 61 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  arent;.  }.  ret
bf90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bfa0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 61  ../*.** Write ma
bfb0: 70 70 69 6e 67 20 28 69 52 6f 77 69 64 2d 3e 69  pping (iRowid->i
bfc0: 4e 6f 64 65 29 20 74 6f 20 74 68 65 20 3c 72 74  Node) to the <rt
bfd0: 72 65 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c 65  ree>_rowid table
bfe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bff0: 72 6f 77 69 64 57 72 69 74 65 28 52 74 72 65 65  rowidWrite(Rtree
c000: 20 2a 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65   *pRtree, sqlite
c010: 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 2c 20  3_int64 iRowid, 
c020: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
c030: 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode){.  sqlite3_
c040: 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72 65  bind_int64(pRtre
c050: 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64 2c 20  e->pWriteRowid, 
c060: 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71  1, iRowid);.  sq
c070: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
c080: 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
c090: 6f 77 69 64 2c 20 32 2c 20 69 4e 6f 64 65 29 3b  owid, 2, iNode);
c0a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
c0b0: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f  pRtree->pWriteRo
c0c0: 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
c0d0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 74  qlite3_reset(pRt
c0e0: 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69 64  ree->pWriteRowid
c0f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
c100: 65 20 6d 61 70 70 69 6e 67 20 28 69 4e 6f 64 65  e mapping (iNode
c110: 2d 3e 69 50 61 72 29 20 74 6f 20 74 68 65 20 3c  ->iPar) to the <
c120: 72 74 72 65 65 3e 5f 70 61 72 65 6e 74 20 74 61  rtree>_parent ta
c130: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
c140: 6e 74 20 70 61 72 65 6e 74 57 72 69 74 65 28 52  nt parentWrite(R
c150: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71  tree *pRtree, sq
c160: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 6f 64  lite3_int64 iNod
c170: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
c180: 20 69 50 61 72 29 7b 0a 20 20 73 71 6c 69 74 65   iPar){.  sqlite
c190: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74  3_bind_int64(pRt
c1a0: 72 65 65 2d 3e 70 57 72 69 74 65 50 61 72 65 6e  ree->pWriteParen
c1b0: 74 2c 20 31 2c 20 69 4e 6f 64 65 29 3b 0a 20 20  t, 1, iNode);.  
c1c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
c1d0: 36 34 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74  64(pRtree->pWrit
c1e0: 65 50 61 72 65 6e 74 2c 20 32 2c 20 69 50 61 72  eParent, 2, iPar
c1f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
c200: 70 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65  p(pRtree->pWrite
c210: 50 61 72 65 6e 74 29 3b 0a 20 20 72 65 74 75 72  Parent);.  retur
c220: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  n sqlite3_reset(
c230: 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 50 61  pRtree->pWritePa
c240: 72 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rent);.}..static
c250: 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72 74   int rtreeInsert
c260: 43 65 6c 6c 28 52 74 72 65 65 20 2a 2c 20 52 74  Cell(Rtree *, Rt
c270: 72 65 65 4e 6f 64 65 20 2a 2c 20 52 74 72 65 65  reeNode *, Rtree
c280: 43 65 6c 6c 20 2a 2c 20 69 6e 74 29 3b 0a 0a 23  Cell *, int);..#
c290: 69 66 20 56 41 52 49 41 4e 54 5f 47 55 54 54 4d  if VARIANT_GUTTM
c2a0: 41 4e 5f 4c 49 4e 45 41 52 5f 53 50 4c 49 54 0a  AN_LINEAR_SPLIT.
c2b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
c2c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6e 65  tion of the line
c2d0: 61 72 20 76 61 72 69 61 6e 74 20 6f 66 20 74 68  ar variant of th
c2e0: 65 20 50 69 63 6b 4e 65 78 74 28 29 20 66 75 6e  e PickNext() fun
c2f0: 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 47 75  ction from.** Gu
c300: 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73 74  ttman[84]..*/.st
c310: 61 74 69 63 20 52 74 72 65 65 43 65 6c 6c 20 2a  atic RtreeCell *
c320: 4c 69 6e 65 61 72 50 69 63 6b 4e 65 78 74 28 0a  LinearPickNext(.
c330: 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c    Rtree *pRtree,
c340: 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43  .  RtreeCell *aC
c350: 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 6e 43 65 6c  ell, .  int nCel
c360: 6c 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  l, .  RtreeCell 
c370: 2a 70 4c 65 66 74 42 6f 78 2c 20 0a 20 20 52 74  *pLeftBox, .  Rt
c380: 72 65 65 43 65 6c 6c 20 2a 70 52 69 67 68 74 42  reeCell *pRightB
c390: 6f 78 2c 0a 20 20 69 6e 74 20 2a 61 69 55 73 65  ox,.  int *aiUse
c3a0: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  d.){.  int ii;. 
c3b0: 20 66 6f 72 28 69 69 3d 30 3b 20 61 69 55 73 65   for(ii=0; aiUse
c3c0: 64 5b 69 69 5d 3b 20 69 69 2b 2b 29 3b 0a 20 20  d[ii]; ii++);.  
c3d0: 61 69 55 73 65 64 5b 69 69 5d 20 3d 20 31 3b 0a  aiUsed[ii] = 1;.
c3e0: 20 20 72 65 74 75 72 6e 20 26 61 43 65 6c 6c 5b    return &aCell[
c3f0: 69 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ii];.}../*.** Im
c400: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
c410: 74 68 65 20 6c 69 6e 65 61 72 20 76 61 72 69 61  the linear varia
c420: 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 53 65  nt of the PickSe
c430: 65 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  eds() function f
c440: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
c450: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  4]..*/.static vo
c460: 69 64 20 4c 69 6e 65 61 72 50 69 63 6b 53 65 65  id LinearPickSee
c470: 64 73 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  ds(.  Rtree *pRt
c480: 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ree,.  RtreeCell
c490: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
c4a0: 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 2a 70  nCell, .  int *p
c4b0: 69 4c 65 66 74 53 65 65 64 2c 20 0a 20 20 69 6e  iLeftSeed, .  in
c4c0: 74 20 2a 70 69 52 69 67 68 74 53 65 65 64 0a 29  t *piRightSeed.)
c4d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
c4e0: 20 69 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a   iLeftSeed = 0;.
c4f0: 20 20 69 6e 74 20 69 52 69 67 68 74 53 65 65 64    int iRightSeed
c500: 20 3d 20 31 3b 0a 20 20 52 74 72 65 65 44 56 61   = 1;.  RtreeDVa
c510: 6c 75 65 20 6d 61 78 4e 6f 72 6d 61 6c 49 6e 6e  lue maxNormalInn
c520: 65 72 57 69 64 74 68 20 3d 20 28 52 74 72 65 65  erWidth = (Rtree
c530: 44 56 61 6c 75 65 29 30 3b 0a 0a 20 20 2f 2a 20  DValue)0;..  /* 
c540: 50 69 63 6b 20 74 77 6f 20 22 73 65 65 64 22 20  Pick two "seed" 
c550: 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 61  cells from the a
c560: 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 2e 20 54  rray of cells. T
c570: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65  he algorithm use
c580: 64 0a 20 20 2a 2a 20 68 65 72 65 20 69 73 20 74  d.  ** here is t
c590: 68 65 20 4c 69 6e 65 61 72 50 69 63 6b 53 65 65  he LinearPickSee
c5a0: 64 73 20 61 6c 67 6f 72 69 74 68 6d 20 66 72 6f  ds algorithm fro
c5b0: 6d 20 47 75 74 6d 61 6e 5b 31 39 38 34 5d 2e 20  m Gutman[1984]. 
c5c0: 54 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  The .  ** indice
c5d0: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 73 65 65  s of the two see
c5e0: 64 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 61  d cells in the a
c5f0: 72 72 61 79 20 61 72 65 20 73 74 6f 72 65 64 20  rray are stored 
c600: 69 6e 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 76 61  in local.  ** va
c610: 72 69 61 62 6c 65 73 20 69 4c 65 66 74 53 65 65  riables iLeftSee
c620: 6b 20 61 6e 64 20 69 52 69 67 68 74 53 65 65 64  k and iRightSeed
c630: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
c640: 3b 20 69 3c 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ; i<pRtree->nDim
c650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65  ; i++){.    Rtre
c660: 65 44 56 61 6c 75 65 20 78 31 20 3d 20 44 43 4f  eDValue x1 = DCO
c670: 4f 52 44 28 61 43 65 6c 6c 5b 30 5d 2e 61 43 6f  ORD(aCell[0].aCo
c680: 6f 72 64 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 52  ord[i*2]);.    R
c690: 74 72 65 65 44 56 61 6c 75 65 20 78 32 20 3d 20  treeDValue x2 = 
c6a0: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 30 5d 2e  DCOORD(aCell[0].
c6b0: 61 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b 0a  aCoord[i*2+1]);.
c6c0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c6d0: 78 33 20 3d 20 78 31 3b 0a 20 20 20 20 52 74 72  x3 = x1;.    Rtr
c6e0: 65 65 44 56 61 6c 75 65 20 78 34 20 3d 20 78 32  eeDValue x4 = x2
c6f0: 3b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20  ;.    int jj;.. 
c700: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 65 66 74     int iCellLeft
c710: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
c720: 65 6c 6c 52 69 67 68 74 20 3d 20 30 3b 0a 0a 20  ellRight = 0;.. 
c730: 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
c740: 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  nCell; jj++){.  
c750: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c760: 6c 65 66 74 20 3d 20 44 43 4f 4f 52 44 28 61 43  left = DCOORD(aC
c770: 65 6c 6c 5b 6a 6a 5d 2e 61 43 6f 6f 72 64 5b 69  ell[jj].aCoord[i
c780: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 52 74 72 65  *2]);.      Rtre
c790: 65 44 56 61 6c 75 65 20 72 69 67 68 74 20 3d 20  eDValue right = 
c7a0: 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 6a 6a 5d  DCOORD(aCell[jj]
c7b0: 2e 61 43 6f 6f 72 64 5b 69 2a 32 2b 31 5d 29 3b  .aCoord[i*2+1]);
c7c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 6c 65 66 74  ..      if( left
c7d0: 3c 78 31 20 29 20 78 31 20 3d 20 6c 65 66 74 3b  <x1 ) x1 = left;
c7e0: 0a 20 20 20 20 20 20 69 66 28 20 72 69 67 68 74  .      if( right
c7f0: 3e 78 34 20 29 20 78 34 20 3d 20 72 69 67 68 74  >x4 ) x4 = right
c800: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 66 74  ;.      if( left
c810: 3e 78 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  >x3 ){.        x
c820: 33 20 3d 20 6c 65 66 74 3b 0a 20 20 20 20 20 20  3 = left;.      
c830: 20 20 69 43 65 6c 6c 52 69 67 68 74 20 3d 20 6a    iCellRight = j
c840: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
c850: 20 69 66 28 20 72 69 67 68 74 3c 78 32 20 29 7b   if( right<x2 ){
c860: 0a 20 20 20 20 20 20 20 20 78 32 20 3d 20 72 69  .        x2 = ri
c870: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 69 43 65  ght;.        iCe
c880: 6c 6c 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20  llLeft = jj;.   
c890: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
c8a0: 69 66 28 20 78 34 21 3d 78 31 20 29 7b 0a 20 20  if( x4!=x1 ){.  
c8b0: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
c8c0: 6e 6f 72 6d 61 6c 77 69 64 74 68 20 3d 20 28 78  normalwidth = (x
c8d0: 33 20 2d 20 78 32 29 20 2f 20 28 78 34 20 2d 20  3 - x2) / (x4 - 
c8e0: 78 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  x1);.      if( n
c8f0: 6f 72 6d 61 6c 77 69 64 74 68 3e 6d 61 78 4e 6f  ormalwidth>maxNo
c900: 72 6d 61 6c 49 6e 6e 65 72 57 69 64 74 68 20 29  rmalInnerWidth )
c910: 7b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 53  {.        iLeftS
c920: 65 65 64 20 3d 20 69 43 65 6c 6c 4c 65 66 74 3b  eed = iCellLeft;
c930: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 53  .        iRightS
c940: 65 65 64 20 3d 20 69 43 65 6c 6c 52 69 67 68 74  eed = iCellRight
c950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c960: 20 20 7d 0a 0a 20 20 2a 70 69 4c 65 66 74 53 65    }..  *piLeftSe
c970: 65 64 20 3d 20 69 4c 65 66 74 53 65 65 64 3b 0a  ed = iLeftSeed;.
c980: 20 20 2a 70 69 52 69 67 68 74 53 65 65 64 20 3d    *piRightSeed =
c990: 20 69 52 69 67 68 74 53 65 65 64 3b 0a 7d 0a 23   iRightSeed;.}.#
c9a0: 65 6e 64 69 66 20 2f 2a 20 56 41 52 49 41 4e 54  endif /* VARIANT
c9b0: 5f 47 55 54 54 4d 41 4e 5f 4c 49 4e 45 41 52 5f  _GUTTMAN_LINEAR_
c9c0: 53 50 4c 49 54 20 2a 2f 0a 0a 23 69 66 20 56 41  SPLIT */..#if VA
c9d0: 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f 51 55  RIANT_GUTTMAN_QU
c9e0: 41 44 52 41 54 49 43 5f 53 50 4c 49 54 0a 2f 2a  ADRATIC_SPLIT./*
c9f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
ca00: 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 64 72 61  on of the quadra
ca10: 74 69 63 20 76 61 72 69 61 6e 74 20 6f 66 20 74  tic variant of t
ca20: 68 65 20 50 69 63 6b 4e 65 78 74 28 29 20 66 75  he PickNext() fu
ca30: 6e 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 47  nction from.** G
ca40: 75 74 74 6d 61 6e 5b 38 34 5d 2e 0a 2a 2f 0a 73  uttman[84]..*/.s
ca50: 74 61 74 69 63 20 52 74 72 65 65 43 65 6c 6c 20  tatic RtreeCell 
ca60: 2a 51 75 61 64 72 61 74 69 63 50 69 63 6b 4e 65  *QuadraticPickNe
ca70: 78 74 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74  xt(.  Rtree *pRt
ca80: 72 65 65 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c  ree,.  RtreeCell
ca90: 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20   *aCell, .  int 
caa0: 6e 43 65 6c 6c 2c 20 0a 20 20 52 74 72 65 65 43  nCell, .  RtreeC
cab0: 65 6c 6c 20 2a 70 4c 65 66 74 42 6f 78 2c 20 0a  ell *pLeftBox, .
cac0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70 52 69    RtreeCell *pRi
cad0: 67 68 74 42 6f 78 2c 0a 20 20 69 6e 74 20 2a 61  ghtBox,.  int *a
cae0: 69 55 73 65 64 0a 29 7b 0a 20 20 23 64 65 66 69  iUsed.){.  #defi
caf0: 6e 65 20 46 41 42 53 28 61 29 20 28 28 61 29 3c  ne FABS(a) ((a)<
cb00: 30 2e 30 3f 2d 31 2e 30 2a 28 61 29 3a 28 61 29  0.0?-1.0*(a):(a)
cb10: 29 0a 0a 20 20 69 6e 74 20 69 53 65 6c 65 63 74  )..  int iSelect
cb20: 20 3d 20 2d 31 3b 0a 20 20 52 74 72 65 65 44 56   = -1;.  RtreeDV
cb30: 61 6c 75 65 20 66 44 69 66 66 3b 0a 20 20 69 6e  alue fDiff;.  in
cb40: 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30  t ii;.  for(ii=0
cb50: 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
cb60: 29 7b 0a 20 20 20 20 69 66 28 20 61 69 55 73 65  ){.    if( aiUse
cb70: 64 5b 69 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  d[ii]==0 ){.    
cb80: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 6c 65    RtreeDValue le
cb90: 66 74 20 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28  ft = cellGrowth(
cba0: 70 52 74 72 65 65 2c 20 70 4c 65 66 74 42 6f 78  pRtree, pLeftBox
cbb0: 2c 20 26 61 43 65 6c 6c 5b 69 69 5d 29 3b 0a 20  , &aCell[ii]);. 
cbc0: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
cbd0: 20 72 69 67 68 74 20 3d 20 63 65 6c 6c 47 72 6f   right = cellGro
cbe0: 77 74 68 28 70 52 74 72 65 65 2c 20 70 4c 65 66  wth(pRtree, pLef
cbf0: 74 42 6f 78 2c 20 26 61 43 65 6c 6c 5b 69 69 5d  tBox, &aCell[ii]
cc00: 29 3b 0a 20 20 20 20 20 20 52 74 72 65 65 44 56  );.      RtreeDV
cc10: 61 6c 75 65 20 64 69 66 66 20 3d 20 46 41 42 53  alue diff = FABS
cc20: 28 72 69 67 68 74 2d 6c 65 66 74 29 3b 0a 20 20  (right-left);.  
cc30: 20 20 20 20 69 66 28 20 69 53 65 6c 65 63 74 3c      if( iSelect<
cc40: 30 20 7c 7c 20 64 69 66 66 3e 66 44 69 66 66 20  0 || diff>fDiff 
cc50: 29 7b 0a 20 20 20 20 20 20 20 20 66 44 69 66 66  ){.        fDiff
cc60: 20 3d 20 64 69 66 66 3b 0a 20 20 20 20 20 20 20   = diff;.       
cc70: 20 69 53 65 6c 65 63 74 20 3d 20 69 69 3b 0a 20   iSelect = ii;. 
cc80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cc90: 0a 20 20 61 69 55 73 65 64 5b 69 53 65 6c 65 63  .  aiUsed[iSelec
cca0: 74 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  t] = 1;.  return
ccb0: 20 26 61 43 65 6c 6c 5b 69 53 65 6c 65 63 74 5d   &aCell[iSelect]
ccc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
ccd0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
cce0: 20 71 75 61 64 72 61 74 69 63 20 76 61 72 69 61   quadratic varia
ccf0: 6e 74 20 6f 66 20 74 68 65 20 50 69 63 6b 53 65  nt of the PickSe
cd00: 65 64 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  eds() function f
cd10: 72 6f 6d 0a 2a 2a 20 47 75 74 74 6d 61 6e 5b 38  rom.** Guttman[8
cd20: 34 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  4]..*/.static vo
cd30: 69 64 20 51 75 61 64 72 61 74 69 63 50 69 63 6b  id QuadraticPick
cd40: 53 65 65 64 73 28 0a 20 20 52 74 72 65 65 20 2a  Seeds(.  Rtree *
cd50: 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 43  pRtree,.  RtreeC
cd60: 65 6c 6c 20 2a 61 43 65 6c 6c 2c 20 0a 20 20 69  ell *aCell, .  i
cd70: 6e 74 20 6e 43 65 6c 6c 2c 20 0a 20 20 69 6e 74  nt nCell, .  int
cd80: 20 2a 70 69 4c 65 66 74 53 65 65 64 2c 20 0a 20   *piLeftSeed, . 
cd90: 20 69 6e 74 20 2a 70 69 52 69 67 68 74 53 65 65   int *piRightSee
cda0: 64 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  d.){.  int ii;. 
cdb0: 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20 69 6e 74 20   int jj;..  int 
cdc0: 69 4c 65 66 74 53 65 65 64 20 3d 20 30 3b 0a 20  iLeftSeed = 0;. 
cdd0: 20 69 6e 74 20 69 52 69 67 68 74 53 65 65 64 20   int iRightSeed 
cde0: 3d 20 31 3b 0a 20 20 52 74 72 65 65 44 56 61 6c  = 1;.  RtreeDVal
cdf0: 75 65 20 66 57 61 73 74 65 20 3d 20 30 2e 30 3b  ue fWaste = 0.0;
ce00: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
ce10: 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20  <nCell; ii++){. 
ce20: 20 20 20 66 6f 72 28 6a 6a 3d 69 69 2b 31 3b 20     for(jj=ii+1; 
ce30: 6a 6a 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b  jj<nCell; jj++){
ce40: 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
ce50: 75 65 20 72 69 67 68 74 20 3d 20 63 65 6c 6c 41  ue right = cellA
ce60: 72 65 61 28 70 52 74 72 65 65 2c 20 26 61 43 65  rea(pRtree, &aCe
ce70: 6c 6c 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 52  ll[jj]);.      R
ce80: 74 72 65 65 44 56 61 6c 75 65 20 67 72 6f 77 74  treeDValue growt
ce90: 68 20 3d 20 63 65 6c 6c 47 72 6f 77 74 68 28 70  h = cellGrowth(p
cea0: 52 74 72 65 65 2c 20 26 61 43 65 6c 6c 5b 69 69  Rtree, &aCell[ii
ceb0: 5d 2c 20 26 61 43 65 6c 6c 5b 6a 6a 5d 29 3b 0a  ], &aCell[jj]);.
cec0: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
ced0: 65 20 77 61 73 74 65 20 3d 20 67 72 6f 77 74 68  e waste = growth
cee0: 20 2d 20 72 69 67 68 74 3b 0a 0a 20 20 20 20 20   - right;..     
cef0: 20 69 66 28 20 77 61 73 74 65 3e 66 57 61 73 74   if( waste>fWast
cf00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 65  e ){.        iLe
cf10: 66 74 53 65 65 64 20 3d 20 69 69 3b 0a 20 20 20  ftSeed = ii;.   
cf20: 20 20 20 20 20 69 52 69 67 68 74 53 65 65 64 20       iRightSeed 
cf30: 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 57  = jj;.        fW
cf40: 61 73 74 65 20 3d 20 77 61 73 74 65 3b 0a 20 20  aste = waste;.  
cf50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cf60: 0a 20 20 2a 70 69 4c 65 66 74 53 65 65 64 20 3d  .  *piLeftSeed =
cf70: 20 69 4c 65 66 74 53 65 65 64 3b 0a 20 20 2a 70   iLeftSeed;.  *p
cf80: 69 52 69 67 68 74 53 65 65 64 20 3d 20 69 52 69  iRightSeed = iRi
cf90: 67 68 74 53 65 65 64 3b 0a 7d 0a 23 65 6e 64 69  ghtSeed;.}.#endi
cfa0: 66 20 2f 2a 20 56 41 52 49 41 4e 54 5f 47 55 54  f /* VARIANT_GUT
cfb0: 54 4d 41 4e 5f 51 55 41 44 52 41 54 49 43 5f 53  TMAN_QUADRATIC_S
cfc0: 50 4c 49 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  PLIT */../*.** A
cfd0: 72 67 75 6d 65 6e 74 73 20 61 49 64 78 2c 20 61  rguments aIdx, a
cfe0: 44 69 73 74 61 6e 63 65 20 61 6e 64 20 61 53 70  Distance and aSp
cff0: 61 72 65 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  are all point to
d000: 20 61 72 72 61 79 73 20 6f 66 20 73 69 7a 65 0a   arrays of size.
d010: 2a 2a 20 6e 49 64 78 2e 20 54 68 65 20 61 49 64  ** nIdx. The aId
d020: 78 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  x array contains
d030: 20 74 68 65 20 73 65 74 20 6f 66 20 69 6e 74 65   the set of inte
d040: 67 65 72 73 20 66 72 6f 6d 20 30 20 74 6f 20 0a  gers from 0 to .
d050: 2a 2a 20 28 6e 49 64 78 2d 31 29 20 69 6e 20 6e  ** (nIdx-1) in n
d060: 6f 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  o particular ord
d070: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
d080: 6e 20 73 6f 72 74 73 20 74 68 65 20 76 61 6c 75  n sorts the valu
d090: 65 73 0a 2a 2a 20 69 6e 20 61 49 64 78 20 61 63  es.** in aIdx ac
d0a0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69  cording to the i
d0b0: 6e 64 65 78 65 64 20 76 61 6c 75 65 73 20 69 6e  ndexed values in
d0c0: 20 61 44 69 73 74 61 6e 63 65 2e 20 46 6f 72 0a   aDistance. For.
d0d0: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
d0e0: 6d 69 6e 67 20 74 68 65 20 69 6e 70 75 74 73 3a  ming the inputs:
d0f0: 0a 2a 2a 0a 2a 2a 20 20 20 61 49 64 78 20 20 20  .**.**   aIdx   
d100: 20 20 20 3d 20 7b 20 30 2c 20 20 20 31 2c 20 20     = { 0,   1,  
d110: 20 32 2c 20 20 20 33 20 7d 0a 2a 2a 20 20 20 61   2,   3 }.**   a
d120: 44 69 73 74 61 6e 63 65 20 3d 20 7b 20 35 2e 30  Distance = { 5.0
d130: 2c 20 32 2e 30 2c 20 37 2e 30 2c 20 36 2e 30 20  , 2.0, 7.0, 6.0 
d140: 7d 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e  }.**.** this fun
d150: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 61  ction sets the a
d160: 49 64 78 20 61 72 72 61 79 20 74 6f 20 63 6f 6e  Idx array to con
d170: 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 49  tain:.**.**   aI
d180: 64 78 20 20 20 20 20 20 3d 20 7b 20 30 2c 20 20  dx      = { 0,  
d190: 20 31 2c 20 20 20 32 2c 20 20 20 33 20 7d 0a 2a   1,   2,   3 }.*
d1a0: 2a 0a 2a 2a 20 54 68 65 20 61 53 70 61 72 65 20  *.** The aSpare 
d1b0: 61 72 72 61 79 20 69 73 20 75 73 65 64 20 61 73  array is used as
d1c0: 20 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b 69   temporary worki
d1d0: 6e 67 20 73 70 61 63 65 20 62 79 20 74 68 65 0a  ng space by the.
d1e0: 2a 2a 20 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72  ** sorting algor
d1f0: 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ithm..*/.static 
d200: 76 6f 69 64 20 53 6f 72 74 42 79 44 69 73 74 61  void SortByDista
d210: 6e 63 65 28 0a 20 20 69 6e 74 20 2a 61 49 64 78  nce(.  int *aIdx
d220: 2c 20 0a 20 20 69 6e 74 20 6e 49 64 78 2c 20 0a  , .  int nIdx, .
d230: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 2a 61    RtreeDValue *a
d240: 44 69 73 74 61 6e 63 65 2c 20 0a 20 20 69 6e 74  Distance, .  int
d250: 20 2a 61 53 70 61 72 65 0a 29 7b 0a 20 20 69 66   *aSpare.){.  if
d260: 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20 20 20  ( nIdx>1 ){.    
d270: 69 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b 0a 20  int iLeft = 0;. 
d280: 20 20 20 69 6e 74 20 69 52 69 67 68 74 20 3d 20     int iRight = 
d290: 30 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66  0;..    int nLef
d2a0: 74 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20 20 20  t = nIdx/2;.    
d2b0: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e 49 64  int nRight = nId
d2c0: 78 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  x-nLeft;.    int
d2d0: 20 2a 61 4c 65 66 74 20 3d 20 61 49 64 78 3b 0a   *aLeft = aIdx;.
d2e0: 20 20 20 20 69 6e 74 20 2a 61 52 69 67 68 74 20      int *aRight 
d2f0: 3d 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d 3b 0a  = &aIdx[nLeft];.
d300: 0a 20 20 20 20 53 6f 72 74 42 79 44 69 73 74 61  .    SortByDista
d310: 6e 63 65 28 61 4c 65 66 74 2c 20 6e 4c 65 66 74  nce(aLeft, nLeft
d320: 2c 20 61 44 69 73 74 61 6e 63 65 2c 20 61 53 70  , aDistance, aSp
d330: 61 72 65 29 3b 0a 20 20 20 20 53 6f 72 74 42 79  are);.    SortBy
d340: 44 69 73 74 61 6e 63 65 28 61 52 69 67 68 74 2c  Distance(aRight,
d350: 20 6e 52 69 67 68 74 2c 20 61 44 69 73 74 61 6e   nRight, aDistan
d360: 63 65 2c 20 61 53 70 61 72 65 29 3b 0a 0a 20 20  ce, aSpare);..  
d370: 20 20 6d 65 6d 63 70 79 28 61 53 70 61 72 65 2c    memcpy(aSpare,
d380: 20 61 4c 65 66 74 2c 20 73 69 7a 65 6f 66 28 69   aLeft, sizeof(i
d390: 6e 74 29 2a 6e 4c 65 66 74 29 3b 0a 20 20 20 20  nt)*nLeft);.    
d3a0: 61 4c 65 66 74 20 3d 20 61 53 70 61 72 65 3b 0a  aLeft = aSpare;.
d3b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 65 66  .    while( iLef
d3c0: 74 3c 6e 4c 65 66 74 20 7c 7c 20 69 52 69 67 68  t<nLeft || iRigh
d3d0: 74 3c 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20  t<nRight ){.    
d3e0: 20 20 69 66 28 20 69 4c 65 66 74 3d 3d 6e 4c 65    if( iLeft==nLe
d3f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 49  ft ){.        aI
d400: 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74 5d  dx[iLeft+iRight]
d410: 20 3d 20 61 52 69 67 68 74 5b 69 52 69 67 68 74   = aRight[iRight
d420: 5d 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  ];.        iRigh
d430: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
d440: 20 69 66 28 20 69 52 69 67 68 74 3d 3d 6e 52 69   if( iRight==nRi
d450: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ght ){.        a
d460: 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74  Idx[iLeft+iRight
d470: 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d  ] = aLeft[iLeft]
d480: 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b  ;.        iLeft+
d490: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
d4a0: 20 20 20 20 20 20 20 20 52 74 72 65 65 44 56 61          RtreeDVa
d4b0: 6c 75 65 20 66 4c 65 66 74 20 3d 20 61 44 69 73  lue fLeft = aDis
d4c0: 74 61 6e 63 65 5b 61 4c 65 66 74 5b 69 4c 65 66  tance[aLeft[iLef
d4d0: 74 5d 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  t]];.        Rtr
d4e0: 65 65 44 56 61 6c 75 65 20 66 52 69 67 68 74 20  eeDValue fRight 
d4f0: 3d 20 61 44 69 73 74 61 6e 63 65 5b 61 52 69 67  = aDistance[aRig
d500: 68 74 5b 69 52 69 67 68 74 5d 5d 3b 0a 20 20 20  ht[iRight]];.   
d510: 20 20 20 20 20 69 66 28 20 66 4c 65 66 74 3c 66       if( fLeft<f
d520: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
d530: 20 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52     aIdx[iLeft+iR
d540: 69 67 68 74 5d 20 3d 20 61 4c 65 66 74 5b 69 4c  ight] = aLeft[iL
d550: 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  eft];.          
d560: 69 4c 65 66 74 2b 2b 3b 0a 20 20 20 20 20 20 20  iLeft++;.       
d570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d580: 20 20 61 49 64 78 5b 69 4c 65 66 74 2b 69 52 69    aIdx[iLeft+iRi
d590: 67 68 74 5d 20 3d 20 61 52 69 67 68 74 5b 69 52  ght] = aRight[iR
d5a0: 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  ight];.         
d5b0: 20 69 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20   iRight++;.     
d5c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d5d0: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
d5e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
d5f0: 73 6f 72 74 20 77 6f 72 6b 65 64 20 2a 2f 0a 20  sort worked */. 
d600: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a     {.      int j
d610: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
d620: 31 3b 20 6a 6a 3c 6e 49 64 78 3b 20 6a 6a 2b 2b  1; jj<nIdx; jj++
d630: 29 7b 0a 20 20 20 20 20 20 20 20 52 74 72 65 65  ){.        Rtree
d640: 44 56 61 6c 75 65 20 6c 65 66 74 20 3d 20 61 44  DValue left = aD
d650: 69 73 74 61 6e 63 65 5b 61 49 64 78 5b 6a 6a 2d  istance[aIdx[jj-
d660: 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20 52 74 72  1]];.        Rtr
d670: 65 65 44 56 61 6c 75 65 20 72 69 67 68 74 20 3d  eeDValue right =
d680: 20 61 44 69 73 74 61 6e 63 65 5b 61 49 64 78 5b   aDistance[aIdx[
d690: 6a 6a 5d 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  jj]];.        as
d6a0: 73 65 72 74 28 20 6c 65 66 74 3c 3d 72 69 67 68  sert( left<=righ
d6b0: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t );.      }.   
d6c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
d6d0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  ./*.** Arguments
d6e0: 20 61 49 64 78 2c 20 61 43 65 6c 6c 20 61 6e 64   aIdx, aCell and
d6f0: 20 61 53 70 61 72 65 20 61 6c 6c 20 70 6f 69 6e   aSpare all poin
d700: 74 20 74 6f 20 61 72 72 61 79 73 20 6f 66 20 73  t to arrays of s
d710: 69 7a 65 0a 2a 2a 20 6e 49 64 78 2e 20 54 68 65  ize.** nIdx. The
d720: 20 61 49 64 78 20 61 72 72 61 79 20 63 6f 6e 74   aIdx array cont
d730: 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66 20  ains the set of 
d740: 69 6e 74 65 67 65 72 73 20 66 72 6f 6d 20 30 20  integers from 0 
d750: 74 6f 20 0a 2a 2a 20 28 6e 49 64 78 2d 31 29 20  to .** (nIdx-1) 
d760: 69 6e 20 6e 6f 20 70 61 72 74 69 63 75 6c 61 72  in no particular
d770: 20 6f 72 64 65 72 2e 20 54 68 69 73 20 66 75 6e   order. This fun
d780: 63 74 69 6f 6e 20 73 6f 72 74 73 20 74 68 65 20  ction sorts the 
d790: 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 61 49 64  values.** in aId
d7a0: 78 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 64  x according to d
d7b0: 69 6d 65 6e 73 69 6f 6e 20 69 44 69 6d 20 6f 66  imension iDim of
d7c0: 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 43   the cells in aC
d7d0: 65 6c 6c 2e 20 54 68 65 0a 2a 2a 20 6d 69 6e 69  ell. The.** mini
d7e0: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 64 69 6d  mum value of dim
d7f0: 65 6e 73 69 6f 6e 20 69 44 69 6d 20 69 73 20 63  ension iDim is c
d800: 6f 6e 73 69 64 65 72 65 64 20 66 69 72 73 74 2c  onsidered first,
d810: 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
d820: 75 73 65 64 20 74 6f 20 62 72 65 61 6b 20 74 69  used to break ti
d830: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 53  es..**.** The aS
d840: 70 61 72 65 20 61 72 72 61 79 20 69 73 20 75 73  pare array is us
d850: 65 64 20 61 73 20 74 65 6d 70 6f 72 61 72 79 20  ed as temporary 
d860: 77 6f 72 6b 69 6e 67 20 73 70 61 63 65 20 62 79  working space by
d870: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 69 6e 67 20   the.** sorting 
d880: 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74  algorithm..*/.st
d890: 61 74 69 63 20 76 6f 69 64 20 53 6f 72 74 42 79  atic void SortBy
d8a0: 44 69 6d 65 6e 73 69 6f 6e 28 0a 20 20 52 74 72  Dimension(.  Rtr
d8b0: 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 69 6e  ee *pRtree,.  in
d8c0: 74 20 2a 61 49 64 78 2c 20 0a 20 20 69 6e 74 20  t *aIdx, .  int 
d8d0: 6e 49 64 78 2c 20 0a 20 20 69 6e 74 20 69 44 69  nIdx, .  int iDi
d8e0: 6d 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  m, .  RtreeCell 
d8f0: 2a 61 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 2a  *aCell, .  int *
d900: 61 53 70 61 72 65 0a 29 7b 0a 20 20 69 66 28 20  aSpare.){.  if( 
d910: 6e 49 64 78 3e 31 20 29 7b 0a 0a 20 20 20 20 69  nIdx>1 ){..    i
d920: 6e 74 20 69 4c 65 66 74 20 3d 20 30 3b 0a 20 20  nt iLeft = 0;.  
d930: 20 20 69 6e 74 20 69 52 69 67 68 74 20 3d 20 30    int iRight = 0
d940: 3b 0a 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66 74  ;..    int nLeft
d950: 20 3d 20 6e 49 64 78 2f 32 3b 0a 20 20 20 20 69   = nIdx/2;.    i
d960: 6e 74 20 6e 52 69 67 68 74 20 3d 20 6e 49 64 78  nt nRight = nIdx
d970: 2d 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20  -nLeft;.    int 
d980: 2a 61 4c 65 66 74 20 3d 20 61 49 64 78 3b 0a 20  *aLeft = aIdx;. 
d990: 20 20 20 69 6e 74 20 2a 61 52 69 67 68 74 20 3d     int *aRight =
d9a0: 20 26 61 49 64 78 5b 6e 4c 65 66 74 5d 3b 0a 0a   &aIdx[nLeft];..
d9b0: 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73      SortByDimens
d9c0: 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 4c 65 66  ion(pRtree, aLef
d9d0: 74 2c 20 6e 4c 65 66 74 2c 20 69 44 69 6d 2c 20  t, nLeft, iDim, 
d9e0: 61 43 65 6c 6c 2c 20 61 53 70 61 72 65 29 3b 0a  aCell, aSpare);.
d9f0: 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65 6e 73      SortByDimens
da00: 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 52 69 67  ion(pRtree, aRig
da10: 68 74 2c 20 6e 52 69 67 68 74 2c 20 69 44 69 6d  ht, nRight, iDim
da20: 2c 20 61 43 65 6c 6c 2c 20 61 53 70 61 72 65 29  , aCell, aSpare)
da30: 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 53  ;..    memcpy(aS
da40: 70 61 72 65 2c 20 61 4c 65 66 74 2c 20 73 69 7a  pare, aLeft, siz
da50: 65 6f 66 28 69 6e 74 29 2a 6e 4c 65 66 74 29 3b  eof(int)*nLeft);
da60: 0a 20 20 20 20 61 4c 65 66 74 20 3d 20 61 53 70  .    aLeft = aSp
da70: 61 72 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  are;.    while( 
da80: 69 4c 65 66 74 3c 6e 4c 65 66 74 20 7c 7c 20 69  iLeft<nLeft || i
da90: 52 69 67 68 74 3c 6e 52 69 67 68 74 20 29 7b 0a  Right<nRight ){.
daa0: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
dab0: 65 20 78 6c 65 66 74 31 20 3d 20 44 43 4f 4f 52  e xleft1 = DCOOR
dac0: 44 28 61 43 65 6c 6c 5b 61 4c 65 66 74 5b 69 4c  D(aCell[aLeft[iL
dad0: 65 66 74 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69  eft]].aCoord[iDi
dae0: 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20 52 74 72  m*2]);.      Rtr
daf0: 65 65 44 56 61 6c 75 65 20 78 6c 65 66 74 32 20  eeDValue xleft2 
db00: 3d 20 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 61  = DCOORD(aCell[a
db10: 4c 65 66 74 5b 69 4c 65 66 74 5d 5d 2e 61 43 6f  Left[iLeft]].aCo
db20: 6f 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a  ord[iDim*2+1]);.
db30: 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
db40: 65 20 78 72 69 67 68 74 31 20 3d 20 44 43 4f 4f  e xright1 = DCOO
db50: 52 44 28 61 43 65 6c 6c 5b 61 52 69 67 68 74 5b  RD(aCell[aRight[
db60: 69 52 69 67 68 74 5d 5d 2e 61 43 6f 6f 72 64 5b  iRight]].aCoord[
db70: 69 44 69 6d 2a 32 5d 29 3b 0a 20 20 20 20 20 20  iDim*2]);.      
db80: 52 74 72 65 65 44 56 61 6c 75 65 20 78 72 69 67  RtreeDValue xrig
db90: 68 74 32 20 3d 20 44 43 4f 4f 52 44 28 61 43 65  ht2 = DCOORD(aCe
dba0: 6c 6c 5b 61 52 69 67 68 74 5b 69 52 69 67 68 74  ll[aRight[iRight
dbb0: 5d 5d 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32  ]].aCoord[iDim*2
dbc0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1]);.      if( 
dbd0: 28 69 4c 65 66 74 21 3d 6e 4c 65 66 74 29 20 26  (iLeft!=nLeft) &
dbe0: 26 20 28 28 69 52 69 67 68 74 3d 3d 6e 52 69 67  & ((iRight==nRig
dbf0: 68 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 78  ht).       || (x
dc00: 6c 65 66 74 31 3c 78 72 69 67 68 74 31 29 0a 20  left1<xright1). 
dc10: 20 20 20 20 20 20 7c 7c 20 28 78 6c 65 66 74 31        || (xleft1
dc20: 3d 3d 78 72 69 67 68 74 31 20 26 26 20 78 6c 65  ==xright1 && xle
dc30: 66 74 32 3c 78 72 69 67 68 74 32 29 0a 20 20 20  ft2<xright2).   
dc40: 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 61     )){.        a
dc50: 49 64 78 5b 69 4c 65 66 74 2b 69 52 69 67 68 74  Idx[iLeft+iRight
dc60: 5d 20 3d 20 61 4c 65 66 74 5b 69 4c 65 66 74 5d  ] = aLeft[iLeft]
dc70: 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 66 74 2b  ;.        iLeft+
dc80: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
dc90: 20 20 20 20 20 20 20 20 61 49 64 78 5b 69 4c 65          aIdx[iLe
dca0: 66 74 2b 69 52 69 67 68 74 5d 20 3d 20 61 52 69  ft+iRight] = aRi
dcb0: 67 68 74 5b 69 52 69 67 68 74 5d 3b 0a 20 20 20  ght[iRight];.   
dcc0: 20 20 20 20 20 69 52 69 67 68 74 2b 2b 3b 0a 20       iRight++;. 
dcd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
dce0: 66 20 30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  f 0.    /* Check
dcf0: 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 77   that the sort w
dd00: 6f 72 6b 65 64 20 2a 2f 0a 20 20 20 20 7b 0a 20  orked */.    {. 
dd10: 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
dd20: 20 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c     for(jj=1; jj<
dd30: 6e 49 64 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  nIdx; jj++){.   
dd40: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
dd50: 20 78 6c 65 66 74 31 20 3d 20 61 43 65 6c 6c 5b   xleft1 = aCell[
dd60: 61 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43 6f 6f  aIdx[jj-1]].aCoo
dd70: 72 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20 20 20  rd[iDim*2];.    
dd80: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
dd90: 78 6c 65 66 74 32 20 3d 20 61 43 65 6c 6c 5b 61  xleft2 = aCell[a
dda0: 49 64 78 5b 6a 6a 2d 31 5d 5d 2e 61 43 6f 6f 72  Idx[jj-1]].aCoor
ddb0: 64 5b 69 44 69 6d 2a 32 2b 31 5d 3b 0a 20 20 20  d[iDim*2+1];.   
ddc0: 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65       RtreeDValue
ddd0: 20 78 72 69 67 68 74 31 20 3d 20 61 43 65 6c 6c   xright1 = aCell
dde0: 5b 61 49 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72  [aIdx[jj]].aCoor
ddf0: 64 5b 69 44 69 6d 2a 32 5d 3b 0a 20 20 20 20 20  d[iDim*2];.     
de00: 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 78     RtreeDValue x
de10: 72 69 67 68 74 32 20 3d 20 61 43 65 6c 6c 5b 61  right2 = aCell[a
de20: 49 64 78 5b 6a 6a 5d 5d 2e 61 43 6f 6f 72 64 5b  Idx[jj]].aCoord[
de30: 69 44 69 6d 2a 32 2b 31 5d 3b 0a 20 20 20 20 20  iDim*2+1];.     
de40: 20 20 20 61 73 73 65 72 74 28 20 78 6c 65 66 74     assert( xleft
de50: 31 3c 3d 78 72 69 67 68 74 31 20 26 26 20 28 78  1<=xright1 && (x
de60: 6c 65 66 74 31 3c 78 72 69 67 68 74 31 20 7c 7c  left1<xright1 ||
de70: 20 78 6c 65 66 74 32 3c 3d 78 72 69 67 68 74 32   xleft2<=xright2
de80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
de90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
dea0: 0a 23 69 66 20 56 41 52 49 41 4e 54 5f 52 53 54  .#if VARIANT_RST
deb0: 41 52 54 52 45 45 5f 53 50 4c 49 54 0a 2f 2a 0a  ARTREE_SPLIT./*.
dec0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
ded0: 6e 20 6f 66 20 74 68 65 20 52 2a 2d 74 72 65 65  n of the R*-tree
dee0: 20 76 61 72 69 61 6e 74 20 6f 66 20 53 70 6c 69   variant of Spli
def0: 74 4e 6f 64 65 20 66 72 6f 6d 20 42 65 63 6b 6d  tNode from Beckm
df00: 61 6e 5b 31 39 39 30 5d 2e 0a 2a 2f 0a 73 74 61  an[1990]..*/.sta
df10: 74 69 63 20 69 6e 74 20 73 70 6c 69 74 4e 6f 64  tic int splitNod
df20: 65 53 74 61 72 74 72 65 65 28 0a 20 20 52 74 72  eStartree(.  Rtr
df30: 65 65 20 2a 70 52 74 72 65 65 2c 0a 20 20 52 74  ee *pRtree,.  Rt
df40: 72 65 65 43 65 6c 6c 20 2a 61 43 65 6c 6c 2c 0a  reeCell *aCell,.
df50: 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 0a 20 20 52    int nCell,.  R
df60: 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 66 74 2c  treeNode *pLeft,
df70: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52  .  RtreeNode *pR
df80: 69 67 68 74 2c 0a 20 20 52 74 72 65 65 43 65 6c  ight,.  RtreeCel
df90: 6c 20 2a 70 42 62 6f 78 4c 65 66 74 2c 0a 20 20  l *pBboxLeft,.  
dfa0: 52 74 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78  RtreeCell *pBbox
dfb0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 2a  Right.){.  int *
dfc0: 2a 61 61 53 6f 72 74 65 64 3b 0a 20 20 69 6e 74  *aaSorted;.  int
dfd0: 20 2a 61 53 70 61 72 65 3b 0a 20 20 69 6e 74 20   *aSpare;.  int 
dfe0: 69 69 3b 0a 0a 20 20 69 6e 74 20 69 42 65 73 74  ii;..  int iBest
dff0: 44 69 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Dim = 0;.  int i
e000: 42 65 73 74 53 70 6c 69 74 20 3d 20 30 3b 0a 20  BestSplit = 0;. 
e010: 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 42 65   RtreeDValue fBe
e020: 73 74 4d 61 72 67 69 6e 20 3d 20 30 2e 30 3b 0a  stMargin = 0.0;.
e030: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28  .  int nByte = (
e040: 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2b 31 29 2a  pRtree->nDim+1)*
e050: 28 73 69 7a 65 6f 66 28 69 6e 74 2a 29 2b 6e 43  (sizeof(int*)+nC
e060: 65 6c 6c 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  ell*sizeof(int))
e070: 3b 0a 0a 20 20 61 61 53 6f 72 74 65 64 20 3d 20  ;..  aaSorted = 
e080: 28 69 6e 74 20 2a 2a 29 73 71 6c 69 74 65 33 5f  (int **)sqlite3_
e090: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
e0a0: 20 69 66 28 20 21 61 61 53 6f 72 74 65 64 20 29   if( !aaSorted )
e0b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e0c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
e0d0: 20 20 61 53 70 61 72 65 20 3d 20 26 28 28 69 6e    aSpare = &((in
e0e0: 74 20 2a 29 26 61 61 53 6f 72 74 65 64 5b 70 52  t *)&aaSorted[pR
e0f0: 74 72 65 65 2d 3e 6e 44 69 6d 5d 29 5b 70 52 74  tree->nDim])[pRt
e100: 72 65 65 2d 3e 6e 44 69 6d 2a 6e 43 65 6c 6c 5d  ree->nDim*nCell]
e110: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 61 53 6f 72  ;.  memset(aaSor
e120: 74 65 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  ted, 0, nByte);.
e130: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
e140: 52 74 72 65 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b  Rtree->nDim; ii+
e150: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a  +){.    int jj;.
e160: 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69 5d      aaSorted[ii]
e170: 20 3d 20 26 28 28 69 6e 74 20 2a 29 26 61 61 53   = &((int *)&aaS
e180: 6f 72 74 65 64 5b 70 52 74 72 65 65 2d 3e 6e 44  orted[pRtree->nD
e190: 69 6d 5d 29 5b 69 69 2a 6e 43 65 6c 6c 5d 3b 0a  im])[ii*nCell];.
e1a0: 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
e1b0: 3c 6e 43 65 6c 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  <nCell; jj++){. 
e1c0: 20 20 20 20 20 61 61 53 6f 72 74 65 64 5b 69 69       aaSorted[ii
e1d0: 5d 5b 6a 6a 5d 20 3d 20 6a 6a 3b 0a 20 20 20 20  ][jj] = jj;.    
e1e0: 7d 0a 20 20 20 20 53 6f 72 74 42 79 44 69 6d 65  }.    SortByDime
e1f0: 6e 73 69 6f 6e 28 70 52 74 72 65 65 2c 20 61 61  nsion(pRtree, aa
e200: 53 6f 72 74 65 64 5b 69 69 5d 2c 20 6e 43 65 6c  Sorted[ii], nCel
e210: 6c 2c 20 69 69 2c 20 61 43 65 6c 6c 2c 20 61 53  l, ii, aCell, aS
e220: 70 61 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  pare);.  }..  fo
e230: 72 28 69 69 3d 30 3b 20 69 69 3c 70 52 74 72 65  r(ii=0; ii<pRtre
e240: 65 2d 3e 6e 44 69 6d 3b 20 69 69 2b 2b 29 7b 0a  e->nDim; ii++){.
e250: 20 20 20 20 52 74 72 65 65 44 56 61 6c 75 65 20      RtreeDValue 
e260: 6d 61 72 67 69 6e 20 3d 20 30 2e 30 3b 0a 20 20  margin = 0.0;.  
e270: 20 20 52 74 72 65 65 44 56 61 6c 75 65 20 66 42    RtreeDValue fB
e280: 65 73 74 4f 76 65 72 6c 61 70 20 3d 20 30 2e 30  estOverlap = 0.0
e290: 3b 0a 20 20 20 20 52 74 72 65 65 44 56 61 6c 75  ;.    RtreeDValu
e2a0: 65 20 66 42 65 73 74 41 72 65 61 20 3d 20 30 2e  e fBestArea = 0.
e2b0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74  0;.    int iBest
e2c0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Left = 0;.    in
e2d0: 74 20 6e 4c 65 66 74 3b 0a 0a 20 20 20 20 66 6f  t nLeft;..    fo
e2e0: 72 28 0a 20 20 20 20 20 20 6e 4c 65 66 74 3d 52  r(.      nLeft=R
e2f0: 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
e300: 74 72 65 65 29 3b 20 0a 20 20 20 20 20 20 6e 4c  tree); .      nL
e310: 65 66 74 3c 3d 28 6e 43 65 6c 6c 2d 52 54 52 45  eft<=(nCell-RTRE
e320: 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52 74 72 65  E_MINCELLS(pRtre
e330: 65 29 29 3b 20 0a 20 20 20 20 20 20 6e 4c 65 66  e)); .      nLef
e340: 74 2b 2b 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t++.    ){.     
e350: 20 52 74 72 65 65 43 65 6c 6c 20 6c 65 66 74 3b   RtreeCell left;
e360: 0a 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c  .      RtreeCell
e370: 20 72 69 67 68 74 3b 0a 20 20 20 20 20 20 69 6e   right;.      in
e380: 74 20 6b 6b 3b 0a 20 20 20 20 20 20 52 74 72 65  t kk;.      Rtre
e390: 65 44 56 61 6c 75 65 20 6f 76 65 72 6c 61 70 3b  eDValue overlap;
e3a0: 0a 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c  .      RtreeDVal
e3b0: 75 65 20 61 72 65 61 3b 0a 0a 20 20 20 20 20 20  ue area;..      
e3c0: 6d 65 6d 63 70 79 28 26 6c 65 66 74 2c 20 26 61  memcpy(&left, &a
e3d0: 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 69  Cell[aaSorted[ii
e3e0: 5d 5b 30 5d 5d 2c 20 73 69 7a 65 6f 66 28 52 74  ][0]], sizeof(Rt
e3f0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  reeCell));.     
e400: 20 6d 65 6d 63 70 79 28 26 72 69 67 68 74 2c 20   memcpy(&right, 
e410: 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b  &aCell[aaSorted[
e420: 69 69 5d 5b 6e 43 65 6c 6c 2d 31 5d 5d 2c 20 73  ii][nCell-1]], s
e430: 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c 6c 29  izeof(RtreeCell)
e440: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d  );.      for(kk=
e450: 31 3b 20 6b 6b 3c 28 6e 43 65 6c 6c 2d 31 29 3b  1; kk<(nCell-1);
e460: 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   kk++){.        
e470: 69 66 28 20 6b 6b 3c 6e 4c 65 66 74 20 29 7b 0a  if( kk<nLeft ){.
e480: 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 55 6e            cellUn
e490: 69 6f 6e 28 70 52 74 72 65 65 2c 20 26 6c 65 66  ion(pRtree, &lef
e4a0: 74 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74  t, &aCell[aaSort
e4b0: 65 64 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20  ed[ii][kk]]);.  
e4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4d0: 20 20 20 20 20 20 20 63 65 6c 6c 55 6e 69 6f 6e         cellUnion
e4e0: 28 70 52 74 72 65 65 2c 20 26 72 69 67 68 74 2c  (pRtree, &right,
e4f0: 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64   &aCell[aaSorted
e500: 5b 69 69 5d 5b 6b 6b 5d 5d 29 3b 0a 20 20 20 20  [ii][kk]]);.    
e510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e520: 20 20 20 20 6d 61 72 67 69 6e 20 2b 3d 20 63 65      margin += ce
e530: 6c 6c 4d 61 72 67 69 6e 28 70 52 74 72 65 65 2c  llMargin(pRtree,
e540: 20 26 6c 65 66 74 29 3b 0a 20 20 20 20 20 20 6d   &left);.      m
e550: 61 72 67 69 6e 20 2b 3d 20 63 65 6c 6c 4d 61 72  argin += cellMar
e560: 67 69 6e 28 70 52 74 72 65 65 2c 20 26 72 69 67  gin(pRtree, &rig
e570: 68 74 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ht);.      overl
e580: 61 70 20 3d 20 63 65 6c 6c 4f 76 65 72 6c 61 70  ap = cellOverlap
e590: 28 70 52 74 72 65 65 2c 20 26 6c 65 66 74 2c 20  (pRtree, &left, 
e5a0: 26 72 69 67 68 74 2c 20 31 2c 20 2d 31 29 3b 0a  &right, 1, -1);.
e5b0: 20 20 20 20 20 20 61 72 65 61 20 3d 20 63 65 6c        area = cel
e5c0: 6c 41 72 65 61 28 70 52 74 72 65 65 2c 20 26 6c  lArea(pRtree, &l
e5d0: 65 66 74 29 20 2b 20 63 65 6c 6c 41 72 65 61 28  eft) + cellArea(
e5e0: 70 52 74 72 65 65 2c 20 26 72 69 67 68 74 29 3b  pRtree, &right);
e5f0: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 4c 65 66  .      if( (nLef
e600: 74 3d 3d 52 54 52 45 45 5f 4d 49 4e 43 45 4c 4c  t==RTREE_MINCELL
e610: 53 28 70 52 74 72 65 65 29 29 0a 20 20 20 20 20  S(pRtree)).     
e620: 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3c 66 42    || (overlap<fB
e630: 65 73 74 4f 76 65 72 6c 61 70 29 0a 20 20 20 20  estOverlap).    
e640: 20 20 20 7c 7c 20 28 6f 76 65 72 6c 61 70 3d 3d     || (overlap==
e650: 66 42 65 73 74 4f 76 65 72 6c 61 70 20 26 26 20  fBestOverlap && 
e660: 61 72 65 61 3c 66 42 65 73 74 41 72 65 61 29 0a  area<fBestArea).
e670: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e680: 20 69 42 65 73 74 4c 65 66 74 20 3d 20 6e 4c 65   iBestLeft = nLe
e690: 66 74 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73  ft;.        fBes
e6a0: 74 4f 76 65 72 6c 61 70 20 3d 20 6f 76 65 72 6c  tOverlap = overl
e6b0: 61 70 3b 0a 20 20 20 20 20 20 20 20 66 42 65 73  ap;.        fBes
e6c0: 74 41 72 65 61 20 3d 20 61 72 65 61 3b 0a 20 20  tArea = area;.  
e6d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e6e0: 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6d 61   if( ii==0 || ma
e6f0: 72 67 69 6e 3c 66 42 65 73 74 4d 61 72 67 69 6e  rgin<fBestMargin
e700: 20 29 7b 0a 20 20 20 20 20 20 69 42 65 73 74 44   ){.      iBestD
e710: 69 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 66  im = ii;.      f
e720: 42 65 73 74 4d 61 72 67 69 6e 20 3d 20 6d 61 72  BestMargin = mar
e730: 67 69 6e 3b 0a 20 20 20 20 20 20 69 42 65 73 74  gin;.      iBest
e740: 53 70 6c 69 74 20 3d 20 69 42 65 73 74 4c 65 66  Split = iBestLef
e750: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
e760: 6d 65 6d 63 70 79 28 70 42 62 6f 78 4c 65 66 74  memcpy(pBboxLeft
e770: 2c 20 26 61 43 65 6c 6c 5b 61 61 53 6f 72 74 65  , &aCell[aaSorte
e780: 64 5b 69 42 65 73 74 44 69 6d 5d 5b 30 5d 5d 2c  d[iBestDim][0]],
e790: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65 6c   sizeof(RtreeCel
e7a0: 6c 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42  l));.  memcpy(pB
e7b0: 62 6f 78 52 69 67 68 74 2c 20 26 61 43 65 6c 6c  boxRight, &aCell
e7c0: 5b 61 61 53 6f 72 74 65 64 5b 69 42 65 73 74 44  [aaSorted[iBestD
e7d0: 69 6d 5d 5b 69 42 65 73 74 53 70 6c 69 74 5d 5d  im][iBestSplit]]
e7e0: 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 65  , sizeof(RtreeCe
e7f0: 6c 6c 29 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30  ll));.  for(ii=0
e800: 3b 20 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b  ; ii<nCell; ii++
e810: 29 7b 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65  ){.    RtreeNode
e820: 20 2a 70 54 61 72 67 65 74 20 3d 20 28 69 69 3c   *pTarget = (ii<
e830: 69 42 65 73 74 53 70 6c 69 74 29 3f 70 4c 65 66  iBestSplit)?pLef
e840: 74 3a 70 52 69 67 68 74 3b 0a 20 20 20 20 52 74  t:pRight;.    Rt
e850: 72 65 65 43 65 6c 6c 20 2a 70 42 62 6f 78 20 3d  reeCell *pBbox =
e860: 20 28 69 69 3c 69 42 65 73 74 53 70 6c 69 74 29   (ii<iBestSplit)
e870: 3f 70 42 62 6f 78 4c 65 66 74 3a 70 42 62 6f 78  ?pBboxLeft:pBbox
e880: 52 69 67 68 74 3b 0a 20 20 20 20 52 74 72 65 65  Right;.    Rtree
e890: 43 65 6c 6c 20 2a 70 43 65 6c 6c 20 3d 20 26 61  Cell *pCell = &a
e8a0: 43 65 6c 6c 5b 61 61 53 6f 72 74 65 64 5b 69 42  Cell[aaSorted[iB
e8b0: 65 73 74 44 69 6d 5d 5b 69 69 5d 5d 3b 0a 20 20  estDim][ii]];.  
e8c0: 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c    nodeInsertCell
e8d0: 28 70 52 74 72 65 65 2c 20 70 54 61 72 67 65 74  (pRtree, pTarget
e8e0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 63 65  , pCell);.    ce
e8f0: 6c 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20  llUnion(pRtree, 
e900: 70 42 62 6f 78 2c 20 70 43 65 6c 6c 29 3b 0a 20  pBbox, pCell);. 
e910: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
e920: 65 65 28 61 61 53 6f 72 74 65 64 29 3b 0a 20 20  ee(aaSorted);.  
e930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e940: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
e950: 56 41 52 49 41 4e 54 5f 47 55 54 54 4d 41 4e 5f  VARIANT_GUTTMAN_
e960: 53 50 4c 49 54 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  SPLIT./*.** Impl
e970: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
e980: 65 20 72 65 67 75 6c 61 72 20 52 2d 74 72 65 65  e regular R-tree
e990: 20 53 70 6c 69 74 4e 6f 64 65 20 66 72 6f 6d 20   SplitNode from 
e9a0: 47 75 74 74 6d 61 6e 5b 31 39 38 34 5d 2e 0a 2a  Guttman[1984]..*
e9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 6c  /.static int spl
e9c0: 69 74 4e 6f 64 65 47 75 74 74 6d 61 6e 28 0a 20  itNodeGuttman(. 
e9d0: 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 0a   Rtree *pRtree,.
e9e0: 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 61 43 65    RtreeCell *aCe
e9f0: 6c 6c 2c 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c  ll,.  int nCell,
ea00: 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c  .  RtreeNode *pL
ea10: 65 66 74 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65  eft,.  RtreeNode
ea20: 20 2a 70 52 69 67 68 74 2c 0a 20 20 52 74 72 65   *pRight,.  Rtre
ea30: 65 43 65 6c 6c 20 2a 70 42 62 6f 78 4c 65 66 74  eCell *pBboxLeft
ea40: 2c 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70  ,.  RtreeCell *p
ea50: 42 62 6f 78 52 69 67 68 74 0a 29 7b 0a 20 20 69  BboxRight.){.  i
ea60: 6e 74 20 69 4c 65 66 74 53 65 65 64 20 3d 20 30  nt iLeftSeed = 0
ea70: 3b 0a 20 20 69 6e 74 20 69 52 69 67 68 74 53 65  ;.  int iRightSe
ea80: 65 64 20 3d 20 31 3b 0a 20 20 69 6e 74 20 2a 61  ed = 1;.  int *a
ea90: 69 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 3b 0a  iUsed;.  int i;.
eaa0: 0a 20 20 61 69 55 73 65 64 20 3d 20 73 71 6c 69  .  aiUsed = sqli
eab0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
eac0: 66 28 69 6e 74 29 2a 6e 43 65 6c 6c 29 3b 0a 20  f(int)*nCell);. 
ead0: 20 69 66 28 20 21 61 69 55 73 65 64 20 29 7b 0a   if( !aiUsed ){.
eae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eaf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
eb00: 65 6d 73 65 74 28 61 69 55 73 65 64 2c 20 30 2c  emset(aiUsed, 0,
eb10: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 65   sizeof(int)*nCe
eb20: 6c 6c 29 3b 0a 0a 20 20 50 69 63 6b 53 65 65 64  ll);..  PickSeed
eb30: 73 28 70 52 74 72 65 65 2c 20 61 43 65 6c 6c 2c  s(pRtree, aCell,
eb40: 20 6e 43 65 6c 6c 2c 20 26 69 4c 65 66 74 53 65   nCell, &iLeftSe
eb50: 65 64 2c 20 26 69 52 69 67 68 74 53 65 65 64 29  ed, &iRightSeed)
eb60: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 70 42 62 6f  ;..  memcpy(pBbo
eb70: 78 4c 65 66 74 2c 20 26 61 43 65 6c 6c 5b 69 4c  xLeft, &aCell[iL
eb80: 65 66 74 53 65 65 64 5d 2c 20 73 69 7a 65 6f 66  eftSeed], sizeof
eb90: 28 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20  (RtreeCell));.  
eba0: 6d 65 6d 63 70 79 28 70 42 62 6f 78 52 69 67 68  memcpy(pBboxRigh
ebb0: 74 2c 20 26 61 43 65 6c 6c 5b 69 52 69 67 68 74  t, &aCell[iRight
ebc0: 53 65 65 64 5d 2c 20 73 69 7a 65 6f 66 28 52 74  Seed], sizeof(Rt
ebd0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e 6f 64  reeCell));.  nod
ebe0: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
ebf0: 65 65 2c 20 70 4c 65 66 74 2c 20 26 61 43 65 6c  ee, pLeft, &aCel
ec00: 6c 5b 69 4c 65 66 74 53 65 65 64 5d 29 3b 0a 20  l[iLeftSeed]);. 
ec10: 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
ec20: 70 52 74 72 65 65 2c 20 70 52 69 67 68 74 2c 20  pRtree, pRight, 
ec30: 26 61 43 65 6c 6c 5b 69 52 69 67 68 74 53 65 65  &aCell[iRightSee
ec40: 64 5d 29 3b 0a 20 20 61 69 55 73 65 64 5b 69 4c  d]);.  aiUsed[iL
ec50: 65 66 74 53 65 65 64 5d 20 3d 20 31 3b 0a 20 20  eftSeed] = 1;.  
ec60: 61 69 55 73 65 64 5b 69 52 69 67 68 74 53 65 65  aiUsed[iRightSee
ec70: 64 5d 20 3d 20 31 3b 0a 0a 20 20 66 6f 72 28 69  d] = 1;..  for(i
ec80: 3d 6e 43 65 6c 6c 2d 32 3b 20 69 3e 30 3b 20 69  =nCell-2; i>0; i
ec90: 2d 2d 29 7b 0a 20 20 20 20 52 74 72 65 65 43 65  --){.    RtreeCe
eca0: 6c 6c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70  ll *pNext;.    p
ecb0: 4e 65 78 74 20 3d 20 50 69 63 6b 4e 65 78 74 28  Next = PickNext(
ecc0: 70 52 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e  pRtree, aCell, n
ecd0: 43 65 6c 6c 2c 20 70 42 62 6f 78 4c 65 66 74 2c  Cell, pBboxLeft,
ece0: 20 70 42 62 6f 78 52 69 67 68 74 2c 20 61 69 55   pBboxRight, aiU
ecf0: 73 65 64 29 3b 0a 20 20 20 20 52 74 72 65 65 44  sed);.    RtreeD
ed00: 56 61 6c 75 65 20 64 69 66 66 20 3d 20 20 0a 20  Value diff =  . 
ed10: 20 20 20 20 20 63 65 6c 6c 47 72 6f 77 74 68 28       cellGrowth(
ed20: 70 52 74 72 65 65 2c 20 70 42 62 6f 78 4c 65 66  pRtree, pBboxLef
ed30: 74 2c 20 70 4e 65 78 74 29 20 2d 20 0a 20 20 20  t, pNext) - .   
ed40: 20 20 20 63 65 6c 6c 47 72 6f 77 74 68 28 70 52     cellGrowth(pR
ed50: 74 72 65 65 2c 20 70 42 62 6f 78 52 69 67 68 74  tree, pBboxRight
ed60: 2c 20 70 4e 65 78 74 29 0a 20 20 20 20 3b 0a 20  , pNext).    ;. 
ed70: 20 20 20 69 66 28 20 28 52 54 52 45 45 5f 4d 49     if( (RTREE_MI
ed80: 4e 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2d 4e  NCELLS(pRtree)-N
ed90: 43 45 4c 4c 28 70 52 69 67 68 74 29 3d 3d 69 29  CELL(pRight)==i)
eda0: 0a 20 20 20 20 20 7c 7c 20 28 64 69 66 66 3e 30  .     || (diff>0
edb0: 2e 30 20 26 26 20 28 52 54 52 45 45 5f 4d 49 4e  .0 && (RTREE_MIN
edc0: 43 45 4c 4c 53 28 70 52 74 72 65 65 29 2d 4e 43  CELLS(pRtree)-NC
edd0: 45 4c 4c 28 70 4c 65 66 74 29 21 3d 69 29 29 0a  ELL(pLeft)!=i)).
ede0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64      ){.      nod
edf0: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
ee00: 65 65 2c 20 70 52 69 67 68 74 2c 20 70 4e 65 78  ee, pRight, pNex
ee10: 74 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e  t);.      cellUn
ee20: 69 6f 6e 28 70 52 74 72 65 65 2c 20 70 42 62 6f  ion(pRtree, pBbo
ee30: 78 52 69 67 68 74 2c 20 70 4e 65 78 74 29 3b 0a  xRight, pNext);.
ee40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee50: 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c 28   nodeInsertCell(
ee60: 70 52 74 72 65 65 2c 20 70 4c 65 66 74 2c 20 70  pRtree, pLeft, p
ee70: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 63 65 6c  Next);.      cel
ee80: 6c 55 6e 69 6f 6e 28 70 52 74 72 65 65 2c 20 70  lUnion(pRtree, p
ee90: 42 62 6f 78 4c 65 66 74 2c 20 70 4e 65 78 74 29  BboxLeft, pNext)
eea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
eeb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 69 55 73  qlite3_free(aiUs
eec0: 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
eed0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
eee0: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 70  f..static int up
eef0: 64 61 74 65 4d 61 70 70 69 6e 67 28 0a 20 20 52  dateMapping(.  R
ef00: 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
ef10: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
ef20: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
ef30: 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  , .  int iHeight
ef40: 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 53 65 74  .){.  int (*xSet
ef50: 4d 61 70 70 69 6e 67 29 28 52 74 72 65 65 20 2a  Mapping)(Rtree *
ef60: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  , sqlite3_int64,
ef70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
ef80: 0a 20 20 78 53 65 74 4d 61 70 70 69 6e 67 20 3d  .  xSetMapping =
ef90: 20 28 28 69 48 65 69 67 68 74 3d 3d 30 29 3f 72   ((iHeight==0)?r
efa0: 6f 77 69 64 57 72 69 74 65 3a 70 61 72 65 6e 74  owidWrite:parent
efb0: 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20 69 48  Write);.  if( iH
efc0: 65 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52  eight>0 ){.    R
efd0: 74 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64  treeNode *pChild
efe0: 20 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75   = nodeHashLooku
eff0: 70 28 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64  p(pRtree, iRowid
f000: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c  );.    if( pChil
f010: 64 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 52  d ){.      nodeR
f020: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
f030: 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b  Child->pParent);
f040: 0a 20 20 20 20 20 20 6e 6f 64 65 52 65 66 65 72  .      nodeRefer
f050: 65 6e 63 65 28 70 4e 6f 64 65 29 3b 0a 20 20 20  ence(pNode);.   
f060: 20 20 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65     pChild->pPare
f070: 6e 74 20 3d 20 70 4e 6f 64 65 3b 0a 20 20 20 20  nt = pNode;.    
f080: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 78  }.  }.  return x
f090: 53 65 74 4d 61 70 70 69 6e 67 28 70 52 74 72 65  SetMapping(pRtre
f0a0: 65 2c 20 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  e, iRowid, pNode
f0b0: 2d 3e 69 4e 6f 64 65 29 3b 0a 7d 0a 0a 73 74 61  ->iNode);.}..sta
f0c0: 74 69 63 20 69 6e 74 20 53 70 6c 69 74 4e 6f 64  tic int SplitNod
f0d0: 65 28 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  e(.  Rtree *pRtr
f0e0: 65 65 2c 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  ee,.  RtreeNode 
f0f0: 2a 70 4e 6f 64 65 2c 0a 20 20 52 74 72 65 65 43  *pNode,.  RtreeC
f100: 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a 20 20 69 6e  ell *pCell,.  in
f110: 74 20 69 48 65 69 67 68 74 0a 29 7b 0a 20 20 69  t iHeight.){.  i
f120: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 65 77 43  nt i;.  int newC
f130: 65 6c 6c 49 73 52 69 67 68 74 20 3d 20 30 3b 0a  ellIsRight = 0;.
f140: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f150: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 43 65  TE_OK;.  int nCe
f160: 6c 6c 20 3d 20 4e 43 45 4c 4c 28 70 4e 6f 64 65  ll = NCELL(pNode
f170: 29 3b 0a 20 20 52 74 72 65 65 43 65 6c 6c 20 2a  );.  RtreeCell *
f180: 61 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  aCell;.  int *ai
f190: 55 73 65 64 3b 0a 0a 20 20 52 74 72 65 65 4e 6f  Used;..  RtreeNo
f1a0: 64 65 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  de *pLeft = 0;. 
f1b0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 52 69 67   RtreeNode *pRig
f1c0: 68 74 20 3d 20 30 3b 0a 0a 20 20 52 74 72 65 65  ht = 0;..  Rtree
f1d0: 43 65 6c 6c 20 6c 65 66 74 62 62 6f 78 3b 0a 20  Cell leftbbox;. 
f1e0: 20 52 74 72 65 65 43 65 6c 6c 20 72 69 67 68 74   RtreeCell right
f1f0: 62 62 6f 78 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  bbox;..  /* Allo
f200: 63 61 74 65 20 61 6e 20 61 72 72 61 79 20 61 6e  cate an array an
f210: 64 20 70 6f 70 75 6c 61 74 65 20 69 74 20 77 69  d populate it wi
f220: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 70 43 65  th a copy of pCe
f230: 6c 6c 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6c 6c  ll and .  ** all
f240: 20 63 65 6c 6c 73 20 66 72 6f 6d 20 6e 6f 64 65   cells from node
f250: 20 70 4c 65 66 74 2e 20 54 68 65 6e 20 7a 65 72   pLeft. Then zer
f260: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6e  o the original n
f270: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 43 65 6c  ode..  */.  aCel
f280: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
f290: 6f 63 28 28 73 69 7a 65 6f 66 28 52 74 72 65 65  oc((sizeof(Rtree
f2a0: 43 65 6c 6c 29 2b 73 69 7a 65 6f 66 28 69 6e 74  Cell)+sizeof(int
f2b0: 29 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b 0a 20  ))*(nCell+1));. 
f2c0: 20 69 66 28 20 21 61 43 65 6c 6c 20 29 7b 0a 20   if( !aCell ){. 
f2d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f2e0: 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 73  OMEM;.    goto s
f2f0: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
f300: 7d 0a 20 20 61 69 55 73 65 64 20 3d 20 28 69 6e  }.  aiUsed = (in
f310: 74 20 2a 29 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c  t *)&aCell[nCell
f320: 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 69  +1];.  memset(ai
f330: 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Used, 0, sizeof(
f340: 69 6e 74 29 2a 28 6e 43 65 6c 6c 2b 31 29 29 3b  int)*(nCell+1));
f350: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
f360: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  ell; i++){.    n
f370: 6f 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65  odeGetCell(pRtre
f380: 65 2c 20 70 4e 6f 64 65 2c 20 69 2c 20 26 61 43  e, pNode, i, &aC
f390: 65 6c 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e  ell[i]);.  }.  n
f3a0: 6f 64 65 5a 65 72 6f 28 70 52 74 72 65 65 2c 20  odeZero(pRtree, 
f3b0: 70 4e 6f 64 65 29 3b 0a 20 20 6d 65 6d 63 70 79  pNode);.  memcpy
f3c0: 28 26 61 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (&aCell[nCell], 
f3d0: 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28 52 74  pCell, sizeof(Rt
f3e0: 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 6e 43 65  reeCell));.  nCe
f3f0: 6c 6c 2b 2b 3b 0a 0a 20 20 69 66 28 20 70 4e 6f  ll++;..  if( pNo
f400: 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b 0a  de->iNode==1 ){.
f410: 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e 6f 64      pRight = nod
f420: 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70 4e 6f  eNew(pRtree, pNo
f430: 64 65 29 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  de);.    pLeft =
f440: 20 6e 6f 64 65 4e 65 77 28 70 52 74 72 65 65 2c   nodeNew(pRtree,
f450: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 70 52 74   pNode);.    pRt
f460: 72 65 65 2d 3e 69 44 65 70 74 68 2b 2b 3b 0a 20  ree->iDepth++;. 
f470: 20 20 20 70 4e 6f 64 65 2d 3e 69 73 44 69 72 74     pNode->isDirt
f480: 79 20 3d 20 31 3b 0a 20 20 20 20 77 72 69 74 65  y = 1;.    write
f490: 49 6e 74 31 36 28 70 4e 6f 64 65 2d 3e 7a 44 61  Int16(pNode->zDa
f4a0: 74 61 2c 20 70 52 74 72 65 65 2d 3e 69 44 65 70  ta, pRtree->iDep
f4b0: 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
f4c0: 20 20 70 4c 65 66 74 20 3d 20 70 4e 6f 64 65 3b    pLeft = pNode;
f4d0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 6e 6f  .    pRight = no
f4e0: 64 65 4e 65 77 28 70 52 74 72 65 65 2c 20 70 4c  deNew(pRtree, pL
f4f0: 65 66 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  eft->pParent);. 
f500: 20 20 20 6e 6f 64 65 52 65 66 65 72 65 6e 63 65     nodeReference
f510: 28 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pLeft);.  }..  
f520: 69 66 28 20 21 70 4c 65 66 74 20 7c 7c 20 21 70  if( !pLeft || !p
f530: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72 63 20  Right ){.    rc 
f540: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f550: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
f560: 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 6d  de_out;.  }..  m
f570: 65 6d 73 65 74 28 70 4c 65 66 74 2d 3e 7a 44 61  emset(pLeft->zDa
f580: 74 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69  ta, 0, pRtree->i
f590: 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 6d 65 6d  NodeSize);.  mem
f5a0: 73 65 74 28 70 52 69 67 68 74 2d 3e 7a 44 61 74  set(pRight->zDat
f5b0: 61 2c 20 30 2c 20 70 52 74 72 65 65 2d 3e 69 4e  a, 0, pRtree->iN
f5c0: 6f 64 65 53 69 7a 65 29 3b 0a 0a 20 20 72 63 20  odeSize);..  rc 
f5d0: 3d 20 41 73 73 69 67 6e 43 65 6c 6c 73 28 70 52  = AssignCells(pR
f5e0: 74 72 65 65 2c 20 61 43 65 6c 6c 2c 20 6e 43 65  tree, aCell, nCe
f5f0: 6c 6c 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ll, pLeft, pRigh
f600: 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 26 72  t, &leftbbox, &r
f610: 69 67 68 74 62 62 6f 78 29 3b 0a 20 20 69 66 28  ightbbox);.  if(
f620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f630: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74  {.    goto split
f640: 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  node_out;.  }.. 
f650: 20 2f 2a 20 45 6e 73 75 72 65 20 62 6f 74 68 20   /* Ensure both 
f660: 63 68 69 6c 64 20 6e 6f 64 65 73 20 68 61 76 65  child nodes have
f670: 20 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73   node numbers as
f680: 73 69 67 6e 65 64 20 74 6f 20 74 68 65 6d 20 62  signed to them b
f690: 79 20 63 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20 6e  y calling.  ** n
f6a0: 6f 64 65 57 72 69 74 65 28 29 2e 20 4e 6f 64 65  odeWrite(). Node
f6b0: 20 70 52 69 67 68 74 20 61 6c 77 61 79 73 20 6e   pRight always n
f6c0: 65 65 64 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62  eeds a node numb
f6d0: 65 72 2c 20 61 73 20 69 74 20 77 61 73 20 63 72  er, as it was cr
f6e0: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 6e 6f  eated.  ** by no
f6f0: 64 65 4e 65 77 28 29 20 61 62 6f 76 65 2e 20 42  deNew() above. B
f700: 75 74 20 6e 6f 64 65 20 70 4c 65 66 74 20 73 6f  ut node pLeft so
f710: 6d 65 74 69 6d 65 73 20 61 6c 72 65 61 64 79 20  metimes already 
f720: 68 61 73 20 61 20 6e 6f 64 65 20 6e 75 6d 62 65  has a node numbe
f730: 72 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  r..  ** In this 
f740: 63 61 73 65 20 61 76 6f 69 64 20 74 68 65 20 61  case avoid the a
f750: 6c 6c 20 74 6f 20 6e 6f 64 65 57 72 69 74 65 28  ll to nodeWrite(
f760: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  )..  */.  if( SQ
f770: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 6e  LITE_OK!=(rc = n
f780: 6f 64 65 57 72 69 74 65 28 70 52 74 72 65 65 2c  odeWrite(pRtree,
f790: 20 70 52 69 67 68 74 29 29 0a 20 20 20 7c 7c 20   pRight)).   || 
f7a0: 28 30 3d 3d 70 4c 65 66 74 2d 3e 69 4e 6f 64 65  (0==pLeft->iNode
f7b0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
f7c0: 72 63 20 3d 20 6e 6f 64 65 57 72 69 74 65 28 70  rc = nodeWrite(p
f7d0: 52 74 72 65 65 2c 20 70 4c 65 66 74 29 29 29 0a  Rtree, pLeft))).
f7e0: 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 70    ){.    goto sp
f7f0: 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 7d  litnode_out;.  }
f800: 0a 0a 20 20 72 69 67 68 74 62 62 6f 78 2e 69 52  ..  rightbbox.iR
f810: 6f 77 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69  owid = pRight->i
f820: 4e 6f 64 65 3b 0a 20 20 6c 65 66 74 62 62 6f 78  Node;.  leftbbox
f830: 2e 69 52 6f 77 69 64 20 3d 20 70 4c 65 66 74 2d  .iRowid = pLeft-
f840: 3e 69 4e 6f 64 65 3b 0a 0a 20 20 69 66 28 20 70  >iNode;..  if( p
f850: 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29  Node->iNode==1 )
f860: 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65 65  {.    rc = rtree
f870: 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65  InsertCell(pRtre
f880: 65 2c 20 70 4c 65 66 74 2d 3e 70 50 61 72 65 6e  e, pLeft->pParen
f890: 74 2c 20 26 6c 65 66 74 62 62 6f 78 2c 20 69 48  t, &leftbbox, iH
f8a0: 65 69 67 68 74 2b 31 29 3b 0a 20 20 20 20 69 66  eight+1);.    if
f8b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f8c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 70  ){.      goto sp
f8d0: 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20 20  litnode_out;.   
f8e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f8f0: 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61 72 65  RtreeNode *pPare
f900: 6e 74 20 3d 20 70 4c 65 66 74 2d 3e 70 50 61 72  nt = pLeft->pPar
f910: 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 43 65  ent;.    int iCe
f920: 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64  ll;.    rc = nod
f930: 65 50 61 72 65 6e 74 49 6e 64 65 78 28 70 52 74  eParentIndex(pRt
f940: 72 65 65 2c 20 70 4c 65 66 74 2c 20 26 69 43 65  ree, pLeft, &iCe
f950: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ll);.    if( rc=
f960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f970: 20 20 20 20 6e 6f 64 65 4f 76 65 72 77 72 69 74      nodeOverwrit
f980: 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20 70 50  eCell(pRtree, pP
f990: 61 72 65 6e 74 2c 20 26 6c 65 66 74 62 62 6f 78  arent, &leftbbox
f9a0: 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , iCell);.      
f9b0: 72 63 20 3d 20 41 64 6a 75 73 74 54 72 65 65 28  rc = AdjustTree(
f9c0: 70 52 74 72 65 65 2c 20 70 50 61 72 65 6e 74 2c  pRtree, pParent,
f9d0: 20 26 6c 65 66 74 62 62 6f 78 29 3b 0a 20 20 20   &leftbbox);.   
f9e0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f9f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fa00: 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f 64 65    goto splitnode
fa10: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
fa20: 20 20 69 66 28 20 28 72 63 20 3d 20 72 74 72 65    if( (rc = rtre
fa30: 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72  eInsertCell(pRtr
fa40: 65 65 2c 20 70 52 69 67 68 74 2d 3e 70 50 61 72  ee, pRight->pPar
fa50: 65 6e 74 2c 20 26 72 69 67 68 74 62 62 6f 78 2c  ent, &rightbbox,
fa60: 20 69 48 65 69 67 68 74 2b 31 29 29 20 29 7b 0a   iHeight+1)) ){.
fa70: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
fa80: 64 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  de_out;.  }..  f
fa90: 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 45 4c 4c 28  or(i=0; i<NCELL(
faa0: 70 52 69 67 68 74 29 3b 20 69 2b 2b 29 7b 0a 20  pRight); i++){. 
fab0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
fac0: 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70 52 74  nodeGetRowid(pRt
fad0: 72 65 65 2c 20 70 52 69 67 68 74 2c 20 69 29 3b  ree, pRight, i);
fae0: 0a 20 20 20 20 72 63 20 3d 20 75 70 64 61 74 65  .    rc = update
faf0: 4d 61 70 70 69 6e 67 28 70 52 74 72 65 65 2c 20  Mapping(pRtree, 
fb00: 69 52 6f 77 69 64 2c 20 70 52 69 67 68 74 2c 20  iRowid, pRight, 
fb10: 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 69 66  iHeight);.    if
fb20: 28 20 69 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d  ( iRowid==pCell-
fb30: 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
fb40: 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74 20   newCellIsRight 
fb50: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
fb60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fb70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fb80: 70 6c 69 74 6e 6f 64 65 5f 6f 75 74 3b 0a 20 20  plitnode_out;.  
fb90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e    }.  }.  if( pN
fba0: 6f 64 65 2d 3e 69 4e 6f 64 65 3d 3d 31 20 29 7b  ode->iNode==1 ){
fbb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fbc0: 4e 43 45 4c 4c 28 70 4c 65 66 74 29 3b 20 69 2b  NCELL(pLeft); i+
fbd0: 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  +){.      i64 iR
fbe0: 6f 77 69 64 20 3d 20 6e 6f 64 65 47 65 74 52 6f  owid = nodeGetRo
fbf0: 77 69 64 28 70 52 74 72 65 65 2c 20 70 4c 65 66  wid(pRtree, pLef
fc00: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63 20  t, i);.      rc 
fc10: 3d 20 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28  = updateMapping(
fc20: 70 52 74 72 65 65 2c 20 69 52 6f 77 69 64 2c 20  pRtree, iRowid, 
fc30: 70 4c 65 66 74 2c 20 69 48 65 69 67 68 74 29 3b  pLeft, iHeight);
fc40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fc50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc60: 20 20 20 20 67 6f 74 6f 20 73 70 6c 69 74 6e 6f      goto splitno
fc70: 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  de_out;.      }.
fc80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
fc90: 28 20 6e 65 77 43 65 6c 6c 49 73 52 69 67 68 74  ( newCellIsRight
fca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
fcb0: 75 70 64 61 74 65 4d 61 70 70 69 6e 67 28 70 52  updateMapping(pR
fcc0: 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e 69 52 6f  tree, pCell->iRo
fcd0: 77 69 64 2c 20 70 4c 65 66 74 2c 20 69 48 65 69  wid, pLeft, iHei
fce0: 67 68 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ght);.  }..  if(
fcf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fd00: 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52  {.    rc = nodeR
fd10: 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
fd20: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 52 69 67  Right);.    pRig
fd30: 68 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ht = 0;.  }.  if
fd40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fd50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  ){.    rc = node
fd60: 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
fd70: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 4c 65 66  pLeft);.    pLef
fd80: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 73 70 6c 69  t = 0;.  }..spli
fd90: 74 6e 6f 64 65 5f 6f 75 74 3a 0a 20 20 6e 6f 64  tnode_out:.  nod
fda0: 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c  eRelease(pRtree,
fdb0: 20 70 52 69 67 68 74 29 3b 0a 20 20 6e 6f 64 65   pRight);.  node
fdc0: 52 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20  Release(pRtree, 
fdd0: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
fde0: 33 5f 66 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20  3_free(aCell);. 
fdf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fe00: 2a 0a 2a 2a 20 49 66 20 6e 6f 64 65 20 70 4c 65  *.** If node pLe
fe10: 61 66 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  af is not the ro
fe20: 6f 74 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65  ot of the r-tree
fe30: 20 61 6e 64 20 69 74 73 20 70 50 61 72 65 6e 74   and its pParent
fe40: 20 70 6f 69 6e 74 65 72 20 69 73 20 0a 2a 2a 20   pointer is .** 
fe50: 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 6c 6f 61 64  still NULL, load
fe60: 20 61 6c 6c 20 61 6e 63 65 73 74 6f 72 20 6e 6f   all ancestor no
fe70: 64 65 73 20 6f 66 20 70 4c 65 61 66 20 69 6e 74  des of pLeaf int
fe80: 6f 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 6f 70  o memory and pop
fe90: 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 70 4c 65  ulate.** the pLe
fea0: 61 66 2d 3e 70 50 61 72 65 6e 74 20 63 68 61 69  af->pParent chai
feb0: 6e 20 61 6c 6c 20 74 68 65 20 77 61 79 20 75 70  n all the way up
fec0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   to the root nod
fed0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
fee0: 65 72 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  eration is requi
fef0: 72 65 64 20 77 68 65 6e 20 61 20 72 6f 77 20 69  red when a row i
ff00: 73 20 64 65 6c 65 74 65 64 20 28 6f 72 20 75 70  s deleted (or up
ff10: 64 61 74 65 64 20 2d 20 61 6e 20 75 70 64 61 74  dated - an updat
ff20: 65 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e  e.** is implemen
ff30: 74 65 64 20 61 73 20 61 20 64 65 6c 65 74 65 20  ted as a delete 
ff40: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69  followed by an i
ff50: 6e 73 65 72 74 29 2e 20 53 51 4c 69 74 65 20 70  nsert). SQLite p
ff60: 72 6f 76 69 64 65 73 20 74 68 65 0a 2a 2a 20 72  rovides the.** r
ff70: 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  owid of the row 
ff80: 74 6f 20 64 65 6c 65 74 65 2c 20 77 68 69 63 68  to delete, which
ff90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
ffa0: 66 69 6e 64 20 74 68 65 20 6c 65 61 66 20 6f 6e  find the leaf on
ffb0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65 6e   which.** the en
ffc0: 74 72 79 20 72 65 73 69 64 65 73 20 28 61 72 67  try resides (arg
ffd0: 75 6d 65 6e 74 20 70 4c 65 61 66 29 2e 20 4f 6e  ument pLeaf). On
ffe0: 63 65 20 74 68 65 20 6c 65 61 66 20 69 73 20 6c  ce the leaf is l
fff0: 6f 63 61 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ocated, this .**
10000 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10010 6c 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  led to determine
10020 20 69 74 73 20 61 6e 63 65 73 74 72 79 2e 0a 2a   its ancestry..*
10030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 78  /.static int fix
10040 4c 65 61 66 50 61 72 65 6e 74 28 52 74 72 65 65  LeafParent(Rtree
10050 20 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e   *pRtree, RtreeN
10060 6f 64 65 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ode *pLeaf){.  i
10070 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10080 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  K;.  RtreeNode *
10090 70 43 68 69 6c 64 20 3d 20 70 4c 65 61 66 3b 0a  pChild = pLeaf;.
100a0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
100b0 49 54 45 5f 4f 4b 20 26 26 20 70 43 68 69 6c 64  ITE_OK && pChild
100c0 2d 3e 69 4e 6f 64 65 21 3d 31 20 26 26 20 70 43  ->iNode!=1 && pC
100d0 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  hild->pParent==0
100e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
100f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
10100 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
10110 5f 72 65 73 65 74 28 29 20 72 65 74 75 72 6e 20  _reset() return 
10120 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  code */.    sqli
10130 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
10140 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65  Rtree->pReadPare
10150 6e 74 2c 20 31 2c 20 70 43 68 69 6c 64 2d 3e 69  nt, 1, pChild->i
10160 4e 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Node);.    rc = 
10170 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 74  sqlite3_step(pRt
10180 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65 6e 74  ree->pReadParent
10190 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
101a0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
101b0 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 54     RtreeNode *pT
101c0 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  est;           /
101d0 2a 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 66  * Used to test f
101e0 6f 72 20 72 65 66 65 72 65 6e 63 65 20 6c 6f 6f  or reference loo
101f0 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ps */.      i64 
10200 69 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  iNode;          
10210 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
10220 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74  number of parent
10230 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 20 20   node */..      
10240 2f 2a 20 42 65 66 6f 72 65 20 73 65 74 74 69 6e  /* Before settin
10250 67 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e  g pChild->pParen
10260 74 2c 20 74 65 73 74 20 74 68 61 74 20 77 65 20  t, test that we 
10270 61 72 65 20 6e 6f 74 20 63 72 65 61 74 69 6e 67  are not creating
10280 20 61 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70   a.      ** loop
10290 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 28   of references (
102a0 61 73 20 77 65 20 77 6f 75 6c 64 20 69 66 2c 20  as we would if, 
102b0 73 61 79 2c 20 70 43 68 69 6c 64 3d 3d 70 50 61  say, pChild==pPa
102c0 72 65 6e 74 29 2e 20 57 65 20 64 6f 6e 27 74 0a  rent). We don't.
102d0 20 20 20 20 20 20 2a 2a 20 77 61 6e 74 20 74 6f        ** want to
102e0 20 64 6f 20 74 68 69 73 20 61 73 20 69 74 20 6c   do this as it l
102f0 65 61 64 73 20 74 6f 20 61 20 6d 65 6d 6f 72 79  eads to a memory
10300 20 6c 65 61 6b 20 77 68 65 6e 20 74 72 79 69 6e   leak when tryin
10310 67 20 74 6f 20 64 65 6c 65 74 65 0a 20 20 20 20  g to delete.    
10320 20 20 2a 2a 20 74 68 65 20 72 65 66 65 72 65 6e    ** the referen
10330 63 65 64 20 63 6f 75 6e 74 65 64 20 6e 6f 64 65  ced counted node
10340 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20 20   structures..   
10350 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 4e 6f 64     */.      iNod
10360 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
10370 6d 6e 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d  mn_int64(pRtree-
10380 3e 70 52 65 61 64 50 61 72 65 6e 74 2c 20 30 29  >pReadParent, 0)
10390 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 73  ;.      for(pTes
103a0 74 3d 70 4c 65 61 66 3b 20 70 54 65 73 74 20 26  t=pLeaf; pTest &
103b0 26 20 70 54 65 73 74 2d 3e 69 4e 6f 64 65 21 3d  & pTest->iNode!=
103c0 69 4e 6f 64 65 3b 20 70 54 65 73 74 3d 70 54 65  iNode; pTest=pTe
103d0 73 74 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  st->pParent);.  
103e0 20 20 20 20 69 66 28 20 21 70 54 65 73 74 20 29      if( !pTest )
103f0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
10400 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52 74 72  nodeAcquire(pRtr
10410 65 65 2c 20 69 4e 6f 64 65 2c 20 30 2c 20 26 70  ee, iNode, 0, &p
10420 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74 29 3b  Child->pParent);
10430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10450 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
10460 65 61 64 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  eadParent);.    
10470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10480 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
10490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
104a0 5f 4f 4b 20 26 26 20 21 70 43 68 69 6c 64 2d 3e  _OK && !pChild->
104b0 70 50 61 72 65 6e 74 20 29 20 72 63 20 3d 20 53  pParent ) rc = S
104c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
104d0 41 42 3b 0a 20 20 20 20 70 43 68 69 6c 64 20 3d  AB;.    pChild =
104e0 20 70 43 68 69 6c 64 2d 3e 70 50 61 72 65 6e 74   pChild->pParent
104f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10500 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
10510 20 64 65 6c 65 74 65 43 65 6c 6c 28 52 74 72 65   deleteCell(Rtre
10520 65 20 2a 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  e *, RtreeNode *
10530 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 73 74  , int, int);..st
10540 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 4e  atic int removeN
10550 6f 64 65 28 52 74 72 65 65 20 2a 70 52 74 72 65  ode(Rtree *pRtre
10560 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e  e, RtreeNode *pN
10570 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68 74  ode, int iHeight
10580 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
10590 6e 74 20 72 63 32 3b 0a 20 20 52 74 72 65 65 4e  nt rc2;.  RtreeN
105a0 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 30  ode *pParent = 0
105b0 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a  ;.  int iCell;..
105c0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
105d0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 2f  >nRef==1 );..  /
105e0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74  * Remove the ent
105f0 72 79 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ry in the parent
10600 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d   cell. */.  rc =
10610 20 6e 6f 64 65 50 61 72 65 6e 74 49 6e 64 65 78   nodeParentIndex
10620 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
10630 26 69 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72  &iCell);.  if( r
10640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10650 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 70 4e      pParent = pN
10660 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  ode->pParent;.  
10670 20 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74    pNode->pParent
10680 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 64   = 0;.    rc = d
10690 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65  eleteCell(pRtree
106a0 2c 20 70 50 61 72 65 6e 74 2c 20 69 43 65 6c 6c  , pParent, iCell
106b0 2c 20 69 48 65 69 67 68 74 2b 31 29 3b 0a 20 20  , iHeight+1);.  
106c0 7d 0a 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65  }.  rc2 = nodeRe
106d0 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70 50  lease(pRtree, pP
106e0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
106f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10700 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d     rc = rc2;.  }
10710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
10730 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
10740 20 52 65 6d 6f 76 65 20 74 68 65 20 78 78 78 5f   Remove the xxx_
10750 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  node entry. */. 
10760 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
10770 74 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  t64(pRtree->pDel
10780 65 74 65 4e 6f 64 65 2c 20 31 2c 20 70 4e 6f 64  eteNode, 1, pNod
10790 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 73 71 6c  e->iNode);.  sql
107a0 69 74 65 33 5f 73 74 65 70 28 70 52 74 72 65 65  ite3_step(pRtree
107b0 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 29 3b 0a  ->pDeleteNode);.
107c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
107d0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  =(rc = sqlite3_r
107e0 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44 65  eset(pRtree->pDe
107f0 6c 65 74 65 4e 6f 64 65 29 29 20 29 7b 0a 20 20  leteNode)) ){.  
10800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10810 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
10820 65 20 78 78 78 5f 70 61 72 65 6e 74 20 65 6e 74  e xxx_parent ent
10830 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ry. */.  sqlite3
10840 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 74 72  _bind_int64(pRtr
10850 65 65 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e  ee->pDeleteParen
10860 74 2c 20 31 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  t, 1, pNode->iNo
10870 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  de);.  sqlite3_s
10880 74 65 70 28 70 52 74 72 65 65 2d 3e 70 44 65 6c  tep(pRtree->pDel
10890 65 74 65 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  eteParent);.  if
108a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
108b0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
108c0 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65  (pRtree->pDelete
108d0 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20  Parent)) ){.    
108e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
108f0 20 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68   .  /* Remove th
10900 65 20 6e 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  e node from the 
10910 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
10920 61 62 6c 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74  able and link it
10930 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52   into.  ** the R
10940 74 72 65 65 2e 70 44 65 6c 65 74 65 64 20 6c 69  tree.pDeleted li
10950 73 74 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  st. Its contents
10960 20 77 69 6c 6c 20 62 65 20 72 65 2d 69 6e 73 65   will be re-inse
10970 72 74 65 64 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  rted later on.. 
10980 20 2a 2f 0a 20 20 6e 6f 64 65 48 61 73 68 44 65   */.  nodeHashDe
10990 6c 65 74 65 28 70 52 74 72 65 65 2c 20 70 4e 6f  lete(pRtree, pNo
109a0 64 65 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 69 4e  de);.  pNode->iN
109b0 6f 64 65 20 3d 20 69 48 65 69 67 68 74 3b 0a 20  ode = iHeight;. 
109c0 20 70 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20   pNode->pNext = 
109d0 70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64  pRtree->pDeleted
109e0 3b 0a 20 20 70 4e 6f 64 65 2d 3e 6e 52 65 66 2b  ;.  pNode->nRef+
109f0 2b 3b 0a 20 20 70 52 74 72 65 65 2d 3e 70 44 65  +;.  pRtree->pDe
10a00 6c 65 74 65 64 20 3d 20 70 4e 6f 64 65 3b 0a 0a  leted = pNode;..
10a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a20 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
10a30 74 20 66 69 78 42 6f 75 6e 64 69 6e 67 42 6f 78  t fixBoundingBox
10a40 28 52 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20  (Rtree *pRtree, 
10a50 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64 65  RtreeNode *pNode
10a60 29 7b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  ){.  RtreeNode *
10a70 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65 2d  pParent = pNode-
10a80 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 6e 74 20  >pParent;.  int 
10a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
10aa0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
10ab0 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 0a 20  {.    int ii; . 
10ac0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 4e     int nCell = N
10ad0 43 45 4c 4c 28 70 4e 6f 64 65 29 3b 0a 20 20 20  CELL(pNode);.   
10ae0 20 52 74 72 65 65 43 65 6c 6c 20 62 6f 78 3b 20   RtreeCell box; 
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
10b10 75 6e 64 69 6e 67 20 62 6f 78 20 66 6f 72 20 70  unding box for p
10b20 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 6f 64 65  Node */.    node
10b30 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
10b40 70 4e 6f 64 65 2c 20 30 2c 20 26 62 6f 78 29 3b  pNode, 0, &box);
10b50 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
10b60 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
10b70 20 20 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20        RtreeCell 
10b80 63 65 6c 6c 3b 0a 20 20 20 20 20 20 6e 6f 64 65  cell;.      node
10b90 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  GetCell(pRtree, 
10ba0 70 4e 6f 64 65 2c 20 69 69 2c 20 26 63 65 6c 6c  pNode, ii, &cell
10bb0 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 55 6e 69  );.      cellUni
10bc0 6f 6e 28 70 52 74 72 65 65 2c 20 26 62 6f 78 2c  on(pRtree, &box,
10bd0 20 26 63 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   &cell);.    }. 
10be0 20 20 20 62 6f 78 2e 69 52 6f 77 69 64 20 3d 20     box.iRowid = 
10bf0 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 3b 0a 20 20  pNode->iNode;.  
10c00 20 20 72 63 20 3d 20 6e 6f 64 65 50 61 72 65 6e    rc = nodeParen
10c10 74 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70  tIndex(pRtree, p
10c20 4e 6f 64 65 2c 20 26 69 69 29 3b 0a 20 20 20 20  Node, &ii);.    
10c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10c40 4b 20 29 7b 0a 20 20 20 20 20 20 6e 6f 64 65 4f  K ){.      nodeO
10c50 76 65 72 77 72 69 74 65 43 65 6c 6c 28 70 52 74  verwriteCell(pRt
10c60 72 65 65 2c 20 70 50 61 72 65 6e 74 2c 20 26 62  ree, pParent, &b
10c70 6f 78 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 72  ox, ii);.      r
10c80 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42  c = fixBoundingB
10c90 6f 78 28 70 52 74 72 65 65 2c 20 70 50 61 72 65  ox(pRtree, pPare
10ca0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
10cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10cc0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
10cd0 63 65 6c 6c 20 61 74 20 69 6e 64 65 78 20 69 43  cell at index iC
10ce0 65 6c 6c 20 6f 66 20 6e 6f 64 65 20 70 4e 6f 64  ell of node pNod
10cf0 65 2e 20 41 66 74 65 72 20 72 65 6d 6f 76 69 6e  e. After removin
10d00 67 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2c 20 61  g the.** cell, a
10d10 64 6a 75 73 74 20 74 68 65 20 72 2d 74 72 65 65  djust the r-tree
10d20 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
10d30 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  if required..*/.
10d40 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
10d50 65 43 65 6c 6c 28 52 74 72 65 65 20 2a 70 52 74  eCell(Rtree *pRt
10d60 72 65 65 2c 20 52 74 72 65 65 4e 6f 64 65 20 2a  ree, RtreeNode *
10d70 70 4e 6f 64 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pNode, int iCell
10d80 2c 20 69 6e 74 20 69 48 65 69 67 68 74 29 7b 0a  , int iHeight){.
10d90 20 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 50 61    RtreeNode *pPa
10da0 72 65 6e 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  rent;.  int rc;.
10db0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10dc0 21 3d 28 72 63 20 3d 20 66 69 78 4c 65 61 66 50  !=(rc = fixLeafP
10dd0 61 72 65 6e 74 28 70 52 74 72 65 65 2c 20 70 4e  arent(pRtree, pN
10de0 6f 64 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  ode)) ){.    ret
10df0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
10e00 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 65 6c  * Remove the cel
10e10 6c 20 66 72 6f 6d 20 74 68 65 20 6e 6f 64 65 2e  l from the node.
10e20 20 54 68 69 73 20 63 61 6c 6c 20 6a 75 73 74 20   This call just 
10e30 6d 6f 76 65 73 20 62 79 74 65 73 20 61 72 6f 75  moves bytes arou
10e40 6e 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d  nd.  ** the in-m
10e50 65 6d 6f 72 79 20 6e 6f 64 65 20 69 6d 61 67 65  emory node image
10e60 2c 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 66  , so it cannot f
10e70 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 64 65  ail..  */.  node
10e80 44 65 6c 65 74 65 43 65 6c 6c 28 70 52 74 72 65  DeleteCell(pRtre
10e90 65 2c 20 70 4e 6f 64 65 2c 20 69 43 65 6c 6c 29  e, pNode, iCell)
10ea0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
10eb0 6f 64 65 20 69 73 20 6e 6f 74 20 74 68 65 20 74  ode is not the t
10ec0 72 65 65 20 72 6f 6f 74 20 61 6e 64 20 6e 6f 77  ree root and now
10ed0 20 68 61 73 20 6c 65 73 73 20 74 68 61 6e 20 74   has less than t
10ee0 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 2a 2a 20  he minimum.  ** 
10ef0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 2c  number of cells,
10f00 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
10f10 74 68 65 20 74 72 65 65 2e 20 4f 74 68 65 72 77  the tree. Otherw
10f20 69 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 0a  ise, update the.
10f30 20 20 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65    ** cell in the
10f40 20 70 61 72 65 6e 74 20 6e 6f 64 65 20 73 6f 20   parent node so 
10f50 74 68 61 74 20 69 74 20 74 69 67 68 74 6c 79 20  that it tightly 
10f60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 75 70 64  contains the upd
10f70 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 64 65 2e 0a  ated.  ** node..
10f80 20 20 2a 2f 0a 20 20 70 50 61 72 65 6e 74 20 3d    */.  pParent =
10f90 20 70 4e 6f 64 65 2d 3e 70 50 61 72 65 6e 74 3b   pNode->pParent;
10fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
10fb0 6e 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f  nt || pNode->iNo
10fc0 64 65 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  de==1 );.  if( p
10fd0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 69 66  Parent ){.    if
10fe0 28 20 4e 43 45 4c 4c 28 70 4e 6f 64 65 29 3c 52  ( NCELL(pNode)<R
10ff0 54 52 45 45 5f 4d 49 4e 43 45 4c 4c 53 28 70 52  TREE_MINCELLS(pR
11000 74 72 65 65 29 20 29 7b 0a 20 20 20 20 20 20 72  tree) ){.      r
11010 63 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70  c = removeNode(p
11020 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 69 48  Rtree, pNode, iH
11030 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73  eight);.    }els
11040 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  e{.      rc = fi
11050 78 42 6f 75 6e 64 69 6e 67 42 6f 78 28 70 52 74  xBoundingBox(pRt
11060 72 65 65 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  ree, pNode);.   
11070 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11080 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
11090 6e 74 20 52 65 69 6e 73 65 72 74 28 0a 20 20 52  nt Reinsert(.  R
110a0 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 0a 20  tree *pRtree, . 
110b0 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
110c0 65 2c 20 0a 20 20 52 74 72 65 65 43 65 6c 6c 20  e, .  RtreeCell 
110d0 2a 70 43 65 6c 6c 2c 20 0a 20 20 69 6e 74 20 69  *pCell, .  int i
110e0 48 65 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  Height.){.  int 
110f0 2a 61 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 2a  *aOrder;.  int *
11100 61 53 70 61 72 65 3b 0a 20 20 52 74 72 65 65 43  aSpare;.  RtreeC
11110 65 6c 6c 20 2a 61 43 65 6c 6c 3b 0a 20 20 52 74  ell *aCell;.  Rt
11120 72 65 65 44 56 61 6c 75 65 20 2a 61 44 69 73 74  reeDValue *aDist
11130 61 6e 63 65 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  ance;.  int nCel
11140 6c 3b 0a 20 20 52 74 72 65 65 44 56 61 6c 75 65  l;.  RtreeDValue
11150 20 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 52 54   aCenterCoord[RT
11160 52 45 45 5f 4d 41 58 5f 44 49 4d 45 4e 53 49 4f  REE_MAX_DIMENSIO
11170 4e 53 5d 3b 0a 20 20 69 6e 74 20 69 44 69 6d 3b  NS];.  int iDim;
11180 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
11190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
111a0 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6d 65 6d  .  int n;..  mem
111b0 73 65 74 28 61 43 65 6e 74 65 72 43 6f 6f 72 64  set(aCenterCoord
111c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65  , 0, sizeof(Rtre
111d0 65 44 56 61 6c 75 65 29 2a 52 54 52 45 45 5f 4d  eDValue)*RTREE_M
111e0 41 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 29 3b 0a  AX_DIMENSIONS);.
111f0 0a 20 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c  .  nCell = NCELL
11200 28 70 4e 6f 64 65 29 2b 31 3b 0a 20 20 6e 20 3d  (pNode)+1;.  n =
11210 20 28 6e 43 65 6c 6c 2b 31 29 26 28 7e 31 29 3b   (nCell+1)&(~1);
11220 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11230 74 68 65 20 62 75 66 66 65 72 73 20 75 73 65 64  the buffers used
11240 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
11250 6f 6e 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  on. The allocati
11260 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 6c 69 6e  on is.  ** relin
11270 71 75 69 73 68 65 64 20 62 65 66 6f 72 65 20 74  quished before t
11280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11290 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 43 65  urns..  */.  aCe
112a0 6c 6c 20 3d 20 28 52 74 72 65 65 43 65 6c 6c 20  ll = (RtreeCell 
112b0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
112c0 28 6e 20 2a 20 28 0a 20 20 20 20 73 69 7a 65 6f  (n * (.    sizeo
112d0 66 28 52 74 72 65 65 43 65 6c 6c 29 20 20 20 20  f(RtreeCell)    
112e0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 43   +         /* aC
112f0 65 6c 6c 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ell array */.   
11300 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20   sizeof(int)    
11310 20 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20         +        
11320 20 2f 2a 20 61 4f 72 64 65 72 20 61 72 72 61 79   /* aOrder array
11330 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 69   */.    sizeof(i
11340 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 2b 20  nt)           + 
11350 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 72          /* aSpar
11360 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 73  e array */.    s
11370 69 7a 65 6f 66 28 52 74 72 65 65 44 56 61 6c 75  izeof(RtreeDValu
11380 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e)             /
11390 2a 20 61 44 69 73 74 61 6e 63 65 20 61 72 72 61  * aDistance arra
113a0 79 20 2a 2f 0a 20 20 29 29 3b 0a 20 20 69 66 28  y */.  ));.  if(
113b0 20 21 61 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72   !aCell ){.    r
113c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
113d0 45 4d 3b 0a 20 20 7d 0a 20 20 61 4f 72 64 65 72  EM;.  }.  aOrder
113e0 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 43      = (int *)&aC
113f0 65 6c 6c 5b 6e 5d 3b 0a 20 20 61 53 70 61 72 65  ell[n];.  aSpare
11400 20 20 20 20 3d 20 28 69 6e 74 20 2a 29 26 61 4f      = (int *)&aO
11410 72 64 65 72 5b 6e 5d 3b 0a 20 20 61 44 69 73 74  rder[n];.  aDist
11420 61 6e 63 65 20 3d 20 28 52 74 72 65 65 44 56 61  ance = (RtreeDVa
11430 6c 75 65 20 2a 29 26 61 53 70 61 72 65 5b 6e 5d  lue *)&aSpare[n]
11440 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  ;..  for(ii=0; i
11450 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b 0a  i<nCell; ii++){.
11460 20 20 20 20 69 66 28 20 69 69 3d 3d 28 6e 43 65      if( ii==(nCe
11470 6c 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 6d  ll-1) ){.      m
11480 65 6d 63 70 79 28 26 61 43 65 6c 6c 5b 69 69 5d  emcpy(&aCell[ii]
11490 2c 20 70 43 65 6c 6c 2c 20 73 69 7a 65 6f 66 28  , pCell, sizeof(
114a0 52 74 72 65 65 43 65 6c 6c 29 29 3b 0a 20 20 20  RtreeCell));.   
114b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 6f   }else{.      no
114c0 64 65 47 65 74 43 65 6c 6c 28 70 52 74 72 65 65  deGetCell(pRtree
114d0 2c 20 70 4e 6f 64 65 2c 20 69 69 2c 20 26 61 43  , pNode, ii, &aC
114e0 65 6c 6c 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a  ell[ii]);.    }.
114f0 20 20 20 20 61 4f 72 64 65 72 5b 69 69 5d 20 3d      aOrder[ii] =
11500 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 44 69   ii;.    for(iDi
11510 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65  m=0; iDim<pRtree
11520 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b  ->nDim; iDim++){
11530 0a 20 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f  .      aCenterCo
11540 6f 72 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f  ord[iDim] += DCO
11550 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43  ORD(aCell[ii].aC
11560 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29 3b 0a 20  oord[iDim*2]);. 
11570 20 20 20 20 20 61 43 65 6e 74 65 72 43 6f 6f 72       aCenterCoor
11580 64 5b 69 44 69 6d 5d 20 2b 3d 20 44 43 4f 4f 52  d[iDim] += DCOOR
11590 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
115a0 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 3b 0a 20  rd[iDim*2+1]);. 
115b0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
115c0 44 69 6d 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72  Dim=0; iDim<pRtr
115d0 65 65 2d 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b  ee->nDim; iDim++
115e0 29 7b 0a 20 20 20 20 61 43 65 6e 74 65 72 43 6f  ){.    aCenterCo
115f0 6f 72 64 5b 69 44 69 6d 5d 20 3d 20 28 61 43 65  ord[iDim] = (aCe
11600 6e 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 2f  nterCoord[iDim]/
11610 28 6e 43 65 6c 6c 2a 28 52 74 72 65 65 44 56 61  (nCell*(RtreeDVa
11620 6c 75 65 29 32 29 29 3b 0a 20 20 7d 0a 0a 20 20  lue)2));.  }..  
11630 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 43 65  for(ii=0; ii<nCe
11640 6c 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 61  ll; ii++){.    a
11650 44 69 73 74 61 6e 63 65 5b 69 69 5d 20 3d 20 30  Distance[ii] = 0
11660 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 44 69 6d  .0;.    for(iDim
11670 3d 30 3b 20 69 44 69 6d 3c 70 52 74 72 65 65 2d  =0; iDim<pRtree-
11680 3e 6e 44 69 6d 3b 20 69 44 69 6d 2b 2b 29 7b 0a  >nDim; iDim++){.
11690 20 20 20 20 20 20 52 74 72 65 65 44 56 61 6c 75        RtreeDValu
116a0 65 20 63 6f 6f 72 64 20 3d 20 28 44 43 4f 4f 52  e coord = (DCOOR
116b0 44 28 61 43 65 6c 6c 5b 69 69 5d 2e 61 43 6f 6f  D(aCell[ii].aCoo
116c0 72 64 5b 69 44 69 6d 2a 32 2b 31 5d 29 20 2d 20  rd[iDim*2+1]) - 
116d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 44 43 4f 4f 52 44 28 61 43 65 6c 6c 5b 69 69 5d  DCOORD(aCell[ii]
11700 2e 61 43 6f 6f 72 64 5b 69 44 69 6d 2a 32 5d 29  .aCoord[iDim*2])
11710 29 3b 0a 20 20 20 20 20 20 61 44 69 73 74 61 6e  );.      aDistan
11720 63 65 5b 69 69 5d 20 2b 3d 20 28 63 6f 6f 72 64  ce[ii] += (coord
11730 2d 61 43 65 6e 74 65 72 43 6f 6f 72 64 5b 69 44  -aCenterCoord[iD
11740 69 6d 5d 29 2a 28 63 6f 6f 72 64 2d 61 43 65 6e  im])*(coord-aCen
11750 74 65 72 43 6f 6f 72 64 5b 69 44 69 6d 5d 29 3b  terCoord[iDim]);
11760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 53 6f  .    }.  }..  So
11770 72 74 42 79 44 69 73 74 61 6e 63 65 28 61 4f 72  rtByDistance(aOr
11780 64 65 72 2c 20 6e 43 65 6c 6c 2c 20 61 44 69 73  der, nCell, aDis
11790 74 61 6e 63 65 2c 20 61 53 70 61 72 65 29 3b 0a  tance, aSpare);.
117a0 20 20 6e 6f 64 65 5a 65 72 6f 28 70 52 74 72 65    nodeZero(pRtre
117b0 65 2c 20 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f  e, pNode);..  fo
117c0 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
117d0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 28 6e 43 65  TE_OK && ii<(nCe
117e0 6c 6c 2d 28 52 54 52 45 45 5f 4d 49 4e 43 45 4c  ll-(RTREE_MINCEL
117f0 4c 53 28 70 52 74 72 65 65 29 2b 31 29 29 3b 20  LS(pRtree)+1)); 
11800 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
11810 43 65 6c 6c 20 2a 70 20 3d 20 26 61 43 65 6c 6c  Cell *p = &aCell
11820 5b 61 4f 72 64 65 72 5b 69 69 5d 5d 3b 0a 20 20  [aOrder[ii]];.  
11830 20 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c    nodeInsertCell
11840 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
11850 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p);.    if( p->i
11860 52 6f 77 69 64 3d 3d 70 43 65 6c 6c 2d 3e 69 52  Rowid==pCell->iR
11870 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66  owid ){.      if
11880 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a  ( iHeight==0 ){.
11890 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77          rc = row
118a0 69 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20  idWrite(pRtree, 
118b0 70 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65  p->iRowid, pNode
118c0 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  ->iNode);.      
118d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
118e0 63 20 3d 20 70 61 72 65 6e 74 57 72 69 74 65 28  c = parentWrite(
118f0 70 52 74 72 65 65 2c 20 70 2d 3e 69 52 6f 77 69  pRtree, p->iRowi
11900 64 2c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64 65 29  d, pNode->iNode)
11910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11920 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
11930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11940 63 20 3d 20 66 69 78 42 6f 75 6e 64 69 6e 67 42  c = fixBoundingB
11950 6f 78 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ox(pRtree, pNode
11960 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  );.  }.  for(; r
11970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11980 69 69 3c 6e 43 65 6c 6c 3b 20 69 69 2b 2b 29 7b  ii<nCell; ii++){
11990 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e  .    /* Find a n
119a0 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69  ode to store thi
119b0 73 20 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65  s cell in. pNode
119c0 2d 3e 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ->iNode currentl
119d0 79 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  y contains.    *
119e0 2a 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  * the height of 
119f0 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
11a00 64 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e  ded by the cell.
11a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 52 74 72 65  .    */.    Rtre
11a20 65 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a  eNode *pInsert;.
11a30 20 20 20 20 52 74 72 65 65 43 65 6c 6c 20 2a 70      RtreeCell *p
11a40 20 3d 20 26 61 43 65 6c 6c 5b 61 4f 72 64 65 72   = &aCell[aOrder
11a50 5b 69 69 5d 5d 3b 0a 20 20 20 20 72 63 20 3d 20  [ii]];.    rc = 
11a60 43 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65  ChooseLeaf(pRtre
11a70 65 2c 20 70 2c 20 69 48 65 69 67 68 74 2c 20 26  e, p, iHeight, &
11a80 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 69 66  pInsert);.    if
11a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11aa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
11ab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 74 72  ;.      rc = rtr
11ac0 65 65 49 6e 73 65 72 74 43 65 6c 6c 28 70 52 74  eeInsertCell(pRt
11ad0 72 65 65 2c 20 70 49 6e 73 65 72 74 2c 20 70 2c  ree, pInsert, p,
11ae0 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20   iHeight);.     
11af0 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
11b00 73 65 28 70 52 74 72 65 65 2c 20 70 49 6e 73 65  se(pRtree, pInse
11b10 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
11b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
11b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b50 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
11b60 72 65 65 28 61 43 65 6c 6c 29 3b 0a 20 20 72 65  ree(aCell);.  re
11b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11b80 2a 20 49 6e 73 65 72 74 20 63 65 6c 6c 20 70 43  * Insert cell pC
11b90 65 6c 6c 20 69 6e 74 6f 20 6e 6f 64 65 20 70 4e  ell into node pN
11ba0 6f 64 65 2e 20 4e 6f 64 65 20 70 4e 6f 64 65 20  ode. Node pNode 
11bb0 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  is the head of a
11bc0 20 0a 2a 2a 20 73 75 62 74 72 65 65 20 69 48 65   .** subtree iHe
11bd0 69 67 68 74 20 68 69 67 68 20 28 6c 65 61 66 20  ight high (leaf 
11be0 6e 6f 64 65 73 20 68 61 76 65 20 69 48 65 69 67  nodes have iHeig
11bf0 68 74 3d 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69  ht==0)..*/.stati
11c00 63 20 69 6e 74 20 72 74 72 65 65 49 6e 73 65 72  c int rtreeInser
11c10 74 43 65 6c 6c 28 0a 20 20 52 74 72 65 65 20 2a  tCell(.  Rtree *
11c20 70 52 74 72 65 65 2c 0a 20 20 52 74 72 65 65 4e  pRtree,.  RtreeN
11c30 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 52 74  ode *pNode,.  Rt
11c40 72 65 65 43 65 6c 6c 20 2a 70 43 65 6c 6c 2c 0a  reeCell *pCell,.
11c50 20 20 69 6e 74 20 69 48 65 69 67 68 74 0a 29 7b    int iHeight.){
11c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11c70 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 48 65  TE_OK;.  if( iHe
11c80 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 52 74  ight>0 ){.    Rt
11c90 72 65 65 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20  reeNode *pChild 
11ca0 3d 20 6e 6f 64 65 48 61 73 68 4c 6f 6f 6b 75 70  = nodeHashLookup
11cb0 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c 2d 3e  (pRtree, pCell->
11cc0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
11cd0 20 70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   pChild ){.     
11ce0 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
11cf0 72 65 65 2c 20 70 43 68 69 6c 64 2d 3e 70 50 61  ree, pChild->pPa
11d00 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 6e 6f 64  rent);.      nod
11d10 65 52 65 66 65 72 65 6e 63 65 28 70 4e 6f 64 65  eReference(pNode
11d20 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
11d30 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 6f 64 65  >pParent = pNode
11d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11d50 28 20 6e 6f 64 65 49 6e 73 65 72 74 43 65 6c 6c  ( nodeInsertCell
11d60 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20  (pRtree, pNode, 
11d70 70 43 65 6c 6c 29 20 29 7b 0a 23 69 66 20 56 41  pCell) ){.#if VA
11d80 52 49 41 4e 54 5f 52 53 54 41 52 54 52 45 45 5f  RIANT_RSTARTREE_
11d90 52 45 49 4e 53 45 52 54 0a 20 20 20 20 69 66 28  REINSERT.    if(
11da0 20 69 48 65 69 67 68 74 3c 3d 70 52 74 72 65 65   iHeight<=pRtree
11db0 2d 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67 68  ->iReinsertHeigh
11dc0 74 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 4e 6f 64  t || pNode->iNod
11dd0 65 3d 3d 31 29 7b 0a 20 20 20 20 20 20 72 63 20  e==1){.      rc 
11de0 3d 20 53 70 6c 69 74 4e 6f 64 65 28 70 52 74 72  = SplitNode(pRtr
11df0 65 65 2c 20 70 4e 6f 64 65 2c 20 70 43 65 6c 6c  ee, pNode, pCell
11e00 2c 20 69 48 65 69 67 68 74 29 3b 0a 20 20 20 20  , iHeight);.    
11e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 74  }else{.      pRt
11e20 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74 48 65  ree->iReinsertHe
11e30 69 67 68 74 20 3d 20 69 48 65 69 67 68 74 3b 0a  ight = iHeight;.
11e40 20 20 20 20 20 20 72 63 20 3d 20 52 65 69 6e 73        rc = Reins
11e50 65 72 74 28 70 52 74 72 65 65 2c 20 70 4e 6f 64  ert(pRtree, pNod
11e60 65 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68  e, pCell, iHeigh
11e70 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  t);.    }.#else.
11e80 20 20 20 20 72 63 20 3d 20 53 70 6c 69 74 4e 6f      rc = SplitNo
11e90 64 65 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  de(pRtree, pNode
11ea0 2c 20 70 43 65 6c 6c 2c 20 69 48 65 69 67 68 74  , pCell, iHeight
11eb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
11ec0 65 7b 0a 20 20 20 20 72 63 20 3d 20 41 64 6a 75  e{.    rc = Adju
11ed0 73 74 54 72 65 65 28 70 52 74 72 65 65 2c 20 70  stTree(pRtree, p
11ee0 4e 6f 64 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Node, pCell);.  
11ef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
11f10 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
11f20 20 20 20 20 20 20 20 72 63 20 3d 20 72 6f 77 69         rc = rowi
11f30 64 57 72 69 74 65 28 70 52 74 72 65 65 2c 20 70  dWrite(pRtree, p
11f40 43 65 6c 6c 2d 3e 69 52 6f 77 69 64 2c 20 70 4e  Cell->iRowid, pN
11f50 6f 64 65 2d 3e 69 4e 6f 64 65 29 3b 0a 20 20 20  ode->iNode);.   
11f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f70 20 20 72 63 20 3d 20 70 61 72 65 6e 74 57 72 69    rc = parentWri
11f80 74 65 28 70 52 74 72 65 65 2c 20 70 43 65 6c 6c  te(pRtree, pCell
11f90 2d 3e 69 52 6f 77 69 64 2c 20 70 4e 6f 64 65 2d  ->iRowid, pNode-
11fa0 3e 69 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  >iNode);.      }
11fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
11fd0 63 20 69 6e 74 20 72 65 69 6e 73 65 72 74 4e 6f  c int reinsertNo
11fe0 64 65 43 6f 6e 74 65 6e 74 28 52 74 72 65 65 20  deContent(Rtree 
11ff0 2a 70 52 74 72 65 65 2c 20 52 74 72 65 65 4e 6f  *pRtree, RtreeNo
12000 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e  de *pNode){.  in
12010 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ii;.  int rc =
12020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12030 74 20 6e 43 65 6c 6c 20 3d 20 4e 43 45 4c 4c 28  t nCell = NCELL(
12040 70 4e 6f 64 65 29 3b 0a 0a 20 20 66 6f 72 28 69  pNode);..  for(i
12050 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12060 4f 4b 20 26 26 20 69 69 3c 6e 43 65 6c 6c 3b 20  OK && ii<nCell; 
12070 69 69 2b 2b 29 7b 0a 20 20 20 20 52 74 72 65 65  ii++){.    Rtree
12080 4e 6f 64 65 20 2a 70 49 6e 73 65 72 74 3b 0a 20  Node *pInsert;. 
12090 20 20 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c     RtreeCell cel
120a0 6c 3b 0a 20 20 20 20 6e 6f 64 65 47 65 74 43 65  l;.    nodeGetCe
120b0 6c 6c 28 70 52 74 72 65 65 2c 20 70 4e 6f 64 65  ll(pRtree, pNode
120c0 2c 20 69 69 2c 20 26 63 65 6c 6c 29 3b 0a 0a 20  , ii, &cell);.. 
120d0 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 6e 6f 64     /* Find a nod
120e0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73 20  e to store this 
120f0 63 65 6c 6c 20 69 6e 2e 20 70 4e 6f 64 65 2d 3e  cell in. pNode->
12100 69 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  iNode currently 
12110 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
12120 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
12130 65 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  e sub-tree heade
12140 64 20 62 79 20 74 68 65 20 63 65 6c 6c 2e 0a 20  d by the cell.. 
12150 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 43     */.    rc = C
12160 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
12170 2c 20 26 63 65 6c 6c 2c 20 28 69 6e 74 29 70 4e  , &cell, (int)pN
12180 6f 64 65 2d 3e 69 4e 6f 64 65 2c 20 26 70 49 6e  ode->iNode, &pIn
12190 73 65 72 74 29 3b 0a 20 20 20 20 69 66 28 20 72  sert);.    if( r
121a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
121b0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
121c0 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 49       rc = rtreeI
121d0 6e 73 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65  nsertCell(pRtree
121e0 2c 20 70 49 6e 73 65 72 74 2c 20 26 63 65 6c 6c  , pInsert, &cell
121f0 2c 20 28 69 6e 74 29 70 4e 6f 64 65 2d 3e 69 4e  , (int)pNode->iN
12200 6f 64 65 29 3b 0a 20 20 20 20 20 20 72 63 32 20  ode);.      rc2 
12210 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
12220 74 72 65 65 2c 20 70 49 6e 73 65 72 74 29 3b 0a  tree, pInsert);.
12230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12250 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
12260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12280 2a 0a 2a 2a 20 53 65 6c 65 63 74 20 61 20 63 75  *.** Select a cu
12290 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 20 72  rrently unused r
122a0 6f 77 69 64 20 66 6f 72 20 61 20 6e 65 77 20 72  owid for a new r
122b0 2d 74 72 65 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  -tree record..*/
122c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 52  .static int newR
122d0 6f 77 69 64 28 52 74 72 65 65 20 2a 70 52 74 72  owid(Rtree *pRtr
122e0 65 65 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64  ee, i64 *piRowid
122f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12300 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
12310 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
12320 6f 77 69 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  owid, 1);.  sqli
12330 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 52  te3_bind_null(pR
12340 74 72 65 65 2d 3e 70 57 72 69 74 65 52 6f 77 69  tree->pWriteRowi
12350 64 2c 20 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 2);.  sqlite3
12360 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70 57  _step(pRtree->pW
12370 72 69 74 65 52 6f 77 69 64 29 3b 0a 20 20 72 63  riteRowid);.  rc
12380 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12390 28 70 52 74 72 65 65 2d 3e 70 57 72 69 74 65 52  (pRtree->pWriteR
123a0 6f 77 69 64 29 3b 0a 20 20 2a 70 69 52 6f 77 69  owid);.  *piRowi
123b0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
123c0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 52  _insert_rowid(pR
123d0 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 72 65 74  tree->db);.  ret
123e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
123f0 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72   Remove the entr
12400 79 20 77 69 74 68 20 72 6f 77 69 64 3d 69 44 65  y with rowid=iDe
12410 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20 72 2d  lete from the r-
12420 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
12430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
12440 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 52  reeDeleteRowid(R
12450 74 72 65 65 20 2a 70 52 74 72 65 65 2c 20 73 71  tree *pRtree, sq
12460 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
12470 65 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ete){.  int rc; 
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
124a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 52 74 72 65  n code */.  Rtre
124b0 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20 3d 20 30  eNode *pLeaf = 0
124c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
124d0 65 61 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e  eaf node contain
124e0 69 6e 67 20 72 65 63 6f 72 64 20 69 44 65 6c 65  ing record iDele
124f0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  te */.  int iCel
12500 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
12510 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12520 20 6f 66 20 69 44 65 6c 65 74 65 20 63 65 6c 6c   of iDelete cell
12530 20 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 52   in pLeaf */.  R
12540 74 72 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 3b  treeNode *pRoot;
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12560 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 72  * Root node of r
12570 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
12580 2f 0a 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  /...  /* Obtain 
12590 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
125a0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 74 6f 20  he root node to 
125b0 69 6e 69 74 69 61 6c 69 7a 65 20 52 74 72 65 65  initialize Rtree
125c0 2e 69 44 65 70 74 68 20 2a 2f 0a 20 20 72 63 20  .iDepth */.  rc 
125d0 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
125e0 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 52 6f  tree, 1, 0, &pRo
125f0 6f 74 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  ot);..  /* Obtai
12600 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
12610 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 74   the leaf node t
12620 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
12630 20 65 6e 74 72 79 20 0a 20 20 2a 2a 20 61 62 6f   entry .  ** abo
12640 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ut to be deleted
12650 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  . .  */.  if( rc
12660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12670 20 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66     rc = findLeaf
12680 4e 6f 64 65 28 70 52 74 72 65 65 2c 20 69 44 65  Node(pRtree, iDe
12690 6c 65 74 65 2c 20 26 70 4c 65 61 66 29 3b 0a 20  lete, &pLeaf);. 
126a0 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
126b0 74 68 65 20 63 65 6c 6c 20 69 6e 20 71 75 65 73  the cell in ques
126c0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6c 65  tion from the le
126d0 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
126e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
126f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
12700 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77      rc = nodeRow
12710 69 64 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20  idIndex(pRtree, 
12720 70 4c 65 61 66 2c 20 69 44 65 6c 65 74 65 2c 20  pLeaf, iDelete, 
12730 26 69 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  &iCell);.    if(
12740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 6c  {.      rc = del
12760 65 74 65 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  eteCell(pRtree, 
12770 70 4c 65 61 66 2c 20 69 43 65 6c 6c 2c 20 30 29  pLeaf, iCell, 0)
12780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  ;.    }.    rc2 
12790 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
127a0 74 72 65 65 2c 20 70 4c 65 61 66 29 3b 0a 20 20  tree, pLeaf);.  
127b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
127c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
127d0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
127f0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12800 65 6e 74 72 79 20 69 6e 20 74 68 65 20 3c 72 74  entry in the <rt
12810 72 65 65 3e 5f 72 6f 77 69 64 20 74 61 62 6c 65  ree>_rowid table
12820 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
12830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12840 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12850 36 34 28 70 52 74 72 65 65 2d 3e 70 44 65 6c 65  64(pRtree->pDele
12860 74 65 52 6f 77 69 64 2c 20 31 2c 20 69 44 65 6c  teRowid, 1, iDel
12870 65 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ete);.    sqlite
12880 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e 70  3_step(pRtree->p
12890 44 65 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20  DeleteRowid);.  
128a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
128b0 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 44 65  eset(pRtree->pDe
128c0 6c 65 74 65 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  leteRowid);.  }.
128d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
128e0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6e 6f 77  he root node now
128f0 20 68 61 73 20 65 78 61 63 74 6c 79 20 6f 6e 65   has exactly one
12900 20 63 68 69 6c 64 2e 20 49 66 20 73 6f 2c 20 72   child. If so, r
12910 65 6d 6f 76 65 0a 20 20 2a 2a 20 69 74 2c 20 73  emove.  ** it, s
12920 63 68 65 64 75 6c 65 20 74 68 65 20 63 6f 6e 74  chedule the cont
12930 65 6e 74 73 20 6f 66 20 74 68 65 20 63 68 69 6c  ents of the chil
12940 64 20 66 6f 72 20 72 65 69 6e 73 65 72 74 69 6f  d for reinsertio
12950 6e 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 64 75  n and .  ** redu
12960 63 65 20 74 68 65 20 74 72 65 65 20 68 65 69 67  ce the tree heig
12970 68 74 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2a 0a  ht by one..  **.
12980 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
12990 69 76 61 6c 65 6e 74 20 74 6f 20 63 6f 70 79 69  ivalent to copyi
129a0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
129b0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 69 6e 74  of the child int
129c0 6f 0a 20 20 2a 2a 20 74 68 65 20 72 6f 6f 74 20  o.  ** the root 
129d0 6e 6f 64 65 20 28 74 68 65 20 6f 70 65 72 61 74  node (the operat
129e0 69 6f 6e 20 74 68 61 74 20 47 75 74 6d 61 6e 27  ion that Gutman'
129f0 73 20 70 61 70 65 72 20 73 61 79 73 20 74 6f 20  s paper says to 
12a00 70 65 72 66 6f 72 6d 20 0a 20 20 2a 2a 20 69 6e  perform .  ** in
12a10 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 29 2e   this scenario).
12a20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
12a30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 74  SQLITE_OK && pRt
12a40 72 65 65 2d 3e 69 44 65 70 74 68 3e 30 20 26 26  ree->iDepth>0 &&
12a50 20 4e 43 45 4c 4c 28 70 52 6f 6f 74 29 3d 3d 31   NCELL(pRoot)==1
12a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
12a70 0a 20 20 20 20 52 74 72 65 65 4e 6f 64 65 20 2a  .    RtreeNode *
12a80 70 43 68 69 6c 64 3b 0a 20 20 20 20 69 36 34 20  pChild;.    i64 
12a90 69 43 68 69 6c 64 20 3d 20 6e 6f 64 65 47 65 74  iChild = nodeGet
12aa0 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 70 52  Rowid(pRtree, pR
12ab0 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  oot, 0);.    rc 
12ac0 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70 52  = nodeAcquire(pR
12ad0 74 72 65 65 2c 20 69 43 68 69 6c 64 2c 20 70 52  tree, iChild, pR
12ae0 6f 6f 74 2c 20 26 70 43 68 69 6c 64 29 3b 0a 20  oot, &pChild);. 
12af0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
12b10 20 3d 20 72 65 6d 6f 76 65 4e 6f 64 65 28 70 52   = removeNode(pR
12b20 74 72 65 65 2c 20 70 43 68 69 6c 64 2c 20 70 52  tree, pChild, pR
12b30 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 31 29 3b  tree->iDepth-1);
12b40 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
12b50 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
12b60 72 65 65 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  ree, pChild);.  
12b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12b80 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
12b90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
12bb0 52 74 72 65 65 2d 3e 69 44 65 70 74 68 2d 2d 3b  Rtree->iDepth--;
12bc0 0a 20 20 20 20 20 20 77 72 69 74 65 49 6e 74 31  .      writeInt1
12bd0 36 28 70 52 6f 6f 74 2d 3e 7a 44 61 74 61 2c 20  6(pRoot->zData, 
12be0 70 52 74 72 65 65 2d 3e 69 44 65 70 74 68 29 3b  pRtree->iDepth);
12bf0 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 69 73  .      pRoot->is
12c00 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 7d  Dirty = 1;.    }
12c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 2d 69 6e  .  }..  /* Re-in
12c20 73 65 72 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  sert the content
12c30 73 20 6f 66 20 61 6e 79 20 75 6e 64 65 72 66 75  s of any underfu
12c40 6c 6c 20 6e 6f 64 65 73 20 72 65 6d 6f 76 65 64  ll nodes removed
12c50 20 66 72 6f 6d 20 74 68 65 20 74 72 65 65 2e 20   from the tree. 
12c60 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 61 66 3d 70  */.  for(pLeaf=p
12c70 52 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 3b  Rtree->pDeleted;
12c80 20 70 4c 65 61 66 3b 20 70 4c 65 61 66 3d 70 52   pLeaf; pLeaf=pR
12c90 74 72 65 65 2d 3e 70 44 65 6c 65 74 65 64 29 7b  tree->pDeleted){
12ca0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12cc0 72 63 20 3d 20 72 65 69 6e 73 65 72 74 4e 6f 64  rc = reinsertNod
12cd0 65 43 6f 6e 74 65 6e 74 28 70 52 74 72 65 65 2c  eContent(pRtree,
12ce0 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20   pLeaf);.    }. 
12cf0 20 20 20 70 52 74 72 65 65 2d 3e 70 44 65 6c 65     pRtree->pDele
12d00 74 65 64 20 3d 20 70 4c 65 61 66 2d 3e 70 4e 65  ted = pLeaf->pNe
12d10 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
12d20 66 72 65 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  free(pLeaf);.  }
12d30 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
12d40 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
12d50 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
12d60 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
12d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12d80 3d 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52  = nodeRelease(pR
12d90 74 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20  tree, pRoot);.  
12da0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 6f 64 65 52  }else{.    nodeR
12db0 65 6c 65 61 73 65 28 70 52 74 72 65 65 2c 20 70  elease(pRtree, p
12dc0 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Root);.  }..  re
12dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12de0 2a 20 52 6f 75 6e 64 69 6e 67 20 63 6f 6e 73 74  * Rounding const
12df0 61 6e 74 73 20 66 6f 72 20 66 6c 6f 61 74 2d 3e  ants for float->
12e00 64 6f 75 62 6c 65 20 63 6f 6e 76 65 72 73 69 6f  double conversio
12e10 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4e  n..*/.#define RN
12e20 44 54 4f 57 41 52 44 53 20 20 28 31 2e 30 20 2d  DTOWARDS  (1.0 -
12e30 20 31 2e 30 2f 38 33 38 38 36 30 38 2e 30 29 20   1.0/8388608.0) 
12e40 20 2f 2a 20 52 6f 75 6e 64 20 74 6f 77 61 72 64   /* Round toward
12e50 73 20 7a 65 72 6f 20 2a 2f 0a 23 64 65 66 69 6e  s zero */.#defin
12e60 65 20 52 4e 44 41 57 41 59 20 20 20 20 20 28 31  e RNDAWAY     (1
12e70 2e 30 20 2b 20 31 2e 30 2f 38 33 38 38 36 30 38  .0 + 1.0/8388608
12e80 2e 30 29 20 20 2f 2a 20 52 6f 75 6e 64 20 61 77  .0)  /* Round aw
12e90 61 79 20 66 72 6f 6d 20 7a 65 72 6f 20 2a 2f 0a  ay from zero */.
12ea0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12eb0 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
12ec0 4e 4c 59 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  NLY)./*.** Conve
12ed0 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  rt an sqlite3_va
12ee0 6c 75 65 20 69 6e 74 6f 20 61 6e 20 52 74 72 65  lue into an Rtre
12ef0 65 56 61 6c 75 65 20 28 70 72 65 73 75 6d 61 62  eValue (presumab
12f00 6c 79 20 61 20 66 6c 6f 61 74 29 0a 2a 2a 20 77  ly a float).** w
12f10 68 69 6c 65 20 74 61 6b 69 6e 67 20 63 61 72 65  hile taking care
12f20 20 74 6f 20 72 6f 75 6e 64 20 74 6f 77 61 72 64   to round toward
12f30 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73   negative or pos
12f40 69 74 69 76 65 2c 20 72 65 73 70 65 63 74 69 76  itive, respectiv
12f50 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ely..*/.static R
12f60 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
12f70 61 6c 75 65 44 6f 77 6e 28 73 71 6c 69 74 65 33  alueDown(sqlite3
12f80 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f  _value *v){.  do
12f90 75 62 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33  uble d = sqlite3
12fa0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29  _value_double(v)
12fb0 3b 0a 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66  ;.  float f = (f
12fc0 6c 6f 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3e  loat)d;.  if( f>
12fd0 64 20 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c  d ){.    f = (fl
12fe0 6f 61 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e  oat)(d*(d<0 ? RN
12ff0 44 41 57 41 59 20 3a 20 52 4e 44 54 4f 57 41 52  DAWAY : RNDTOWAR
13000 44 53 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  DS));.  }.  retu
13010 72 6e 20 66 3b 0a 7d 0a 73 74 61 74 69 63 20 52  rn f;.}.static R
13020 74 72 65 65 56 61 6c 75 65 20 72 74 72 65 65 56  treeValue rtreeV
13030 61 6c 75 65 55 70 28 73 71 6c 69 74 65 33 5f 76  alueUp(sqlite3_v
13040 61 6c 75 65 20 2a 76 29 7b 0a 20 20 64 6f 75 62  alue *v){.  doub
13050 6c 65 20 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  le d = sqlite3_v
13060 61 6c 75 65 5f 64 6f 75 62 6c 65 28 76 29 3b 0a  alue_double(v);.
13070 20 20 66 6c 6f 61 74 20 66 20 3d 20 28 66 6c 6f    float f = (flo
13080 61 74 29 64 3b 0a 20 20 69 66 28 20 66 3c 64 20  at)d;.  if( f<d 
13090 29 7b 0a 20 20 20 20 66 20 3d 20 28 66 6c 6f 61  ){.    f = (floa
130a0 74 29 28 64 2a 28 64 3c 30 20 3f 20 52 4e 44 54  t)(d*(d<0 ? RNDT
130b0 4f 57 41 52 44 53 20 3a 20 52 4e 44 41 57 41 59  OWARDS : RNDAWAY
130c0 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
130d0 20 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   f;.}.#endif /* 
130e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
130f0 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 29 20  RTREE_INT_ONLY) 
13100 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  */.../*.** The x
13110 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f  Update method fo
13120 72 20 72 74 72 65 65 20 6d 6f 64 75 6c 65 20 76  r rtree module v
13130 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
13140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74 72  /.static int rtr
13150 65 65 55 70 64 61 74 65 28 0a 20 20 73 71 6c 69  eeUpdate(.  sqli
13160 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13170 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a   .  int nData, .
13180 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
13190 2a 2a 61 7a 44 61 74 61 2c 20 0a 20 20 73 71 6c  **azData, .  sql
131a0 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
131b0 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  d.){.  Rtree *pR
131c0 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
131d0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
131e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
131f0 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20 20  treeCell cell;  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13210 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69 6e  * New cell to in
13220 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31 20  sert if nData>1 
13230 2a 2f 0a 20 20 69 6e 74 20 62 48 61 76 65 52 6f  */.  int bHaveRo
13240 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
13250 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
13260 20 61 66 74 65 72 20 6e 65 77 20 72 6f 77 69 64   after new rowid
13270 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 2a   is determined *
13280 2f 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65  /..  rtreeRefere
13290 6e 63 65 28 70 52 74 72 65 65 29 3b 0a 20 20 61  nce(pRtree);.  a
132a0 73 73 65 72 74 28 6e 44 61 74 61 3e 3d 31 29 3b  ssert(nData>=1);
132b0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e  ..  /* Constrain
132c0 74 20 68 61 6e 64 6c 69 6e 67 2e 20 41 20 77 72  t handling. A wr
132d0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ite operation on
132e0 20 61 6e 20 72 2d 74 72 65 65 20 74 61 62 6c 65   an r-tree table
132f0 20 6d 61 79 20 72 65 74 75 72 6e 0a 20 20 2a 2a   may return.  **
13300 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13310 4e 54 20 66 6f 72 20 74 77 6f 20 72 65 61 73 6f  NT for two reaso
13320 6e 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns:.  **.  **   
13330 31 2e 20 41 20 64 75 70 6c 69 63 61 74 65 20 72  1. A duplicate r
13340 6f 77 69 64 20 76 61 6c 75 65 2c 20 6f 72 0a 20  owid value, or. 
13350 20 2a 2a 20 20 20 32 2e 20 54 68 65 20 73 75 70   **   2. The sup
13360 70 6c 69 65 64 20 64 61 74 61 20 76 69 6f 6c 61  plied data viola
13370 74 65 73 20 74 68 65 20 22 78 32 3e 3d 78 31 22  tes the "x2>=x1"
13380 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a   constraint..  *
13390 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66 69  *.  ** In the fi
133a0 72 73 74 20 63 61 73 65 2c 20 69 66 20 74 68 65  rst case, if the
133b0 20 63 6f 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 69   conflict-handli
133c0 6e 67 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41  ng mode is REPLA
133d0 43 45 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  CE, then.  ** th
133e0 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
133f0 77 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  w can be removed
13400 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
13410 6e 67 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e  ng. In the secon
13420 64 0a 20 20 2a 2a 20 63 61 73 65 2c 20 53 51 4c  d.  ** case, SQL
13430 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 6d  ITE_CONSTRAINT m
13440 75 73 74 20 62 65 20 72 65 74 75 72 6e 65 64 20  ust be returned 
13450 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
13460 65 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d  e.  ** conflict-
13470 68 61 6e 64 6c 69 6e 67 20 6d 6f 64 65 20 73 70  handling mode sp
13480 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 75  ecified by the u
13490 73 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ser..  */.  if( 
134a0 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 69  nData>1 ){.    i
134b0 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 50  nt ii;..    /* P
134c0 6f 70 75 6c 61 74 65 20 74 68 65 20 63 65 6c 6c  opulate the cell
134d0 2e 61 43 6f 6f 72 64 5b 5d 20 61 72 72 61 79 2e  .aCoord[] array.
134e0 20 54 68 65 20 66 69 72 73 74 20 63 6f 6f 72 64   The first coord
134f0 69 6e 61 74 65 20 69 73 20 61 7a 44 61 74 61 5b  inate is azData[
13500 33 5d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  3]. */.    asser
13510 74 28 20 6e 44 61 74 61 3d 3d 28 70 52 74 72 65  t( nData==(pRtre
13520 65 2d 3e 6e 44 69 6d 2a 32 20 2b 20 33 29 20 29  e->nDim*2 + 3) )
13530 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13540 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
13550 20 20 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e      if( pRtree->
13560 65 43 6f 6f 72 64 54 79 70 65 3d 3d 52 54 52 45  eCoordType==RTRE
13570 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32 20 29  E_COORD_REAL32 )
13580 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
13590 3b 20 69 69 3c 28 70 52 74 72 65 65 2d 3e 6e 44  ; ii<(pRtree->nD
135a0 69 6d 2a 32 29 3b 20 69 69 2b 3d 32 29 7b 0a 20  im*2); ii+=2){. 
135b0 20 20 20 20 20 20 20 63 65 6c 6c 2e 61 43 6f 6f         cell.aCoo
135c0 72 64 5b 69 69 5d 2e 66 20 3d 20 72 74 72 65 65  rd[ii].f = rtree
135d0 56 61 6c 75 65 44 6f 77 6e 28 61 7a 44 61 74 61  ValueDown(azData
135e0 5b 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20  [ii+3]);.       
135f0 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b   cell.aCoord[ii+
13600 31 5d 2e 66 20 3d 20 72 74 72 65 65 56 61 6c 75  1].f = rtreeValu
13610 65 55 70 28 61 7a 44 61 74 61 5b 69 69 2b 34 5d  eUp(azData[ii+4]
13620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
13630 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 5d 2e 66  ell.aCoord[ii].f
13640 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b  >cell.aCoord[ii+
13650 31 5d 2e 66 20 29 7b 0a 20 20 20 20 20 20 20 20  1].f ){.        
13660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
13670 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
13680 20 20 20 20 67 6f 74 6f 20 63 6f 6e 73 74 72 61      goto constra
13690 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  int;.        }. 
136a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
136c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
136d0 3c 28 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 32  <(pRtree->nDim*2
136e0 29 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20  ); ii+=2){.     
136f0 20 20 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69     cell.aCoord[i
13700 69 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76  i].i = sqlite3_v
13710 61 6c 75 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b  alue_int(azData[
13720 69 69 2b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20  ii+3]);.        
13730 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69 69 2b 31  cell.aCoord[ii+1
13740 5d 2e 69 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ].i = sqlite3_va
13750 6c 75 65 5f 69 6e 74 28 61 7a 44 61 74 61 5b 69  lue_int(azData[i
13760 69 2b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  i+4]);.        i
13770 66 28 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b 69  f( cell.aCoord[i
13780 69 5d 2e 69 3e 63 65 6c 6c 2e 61 43 6f 6f 72 64  i].i>cell.aCoord
13790 5b 69 69 2b 31 5d 2e 69 20 29 7b 0a 20 20 20 20  [ii+1].i ){.    
137a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
137b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
137c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e          goto con
137d0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20  straint;.       
137e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
137f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 72 6f  ..    /* If a ro
13800 77 69 64 20 76 61 6c 75 65 20 77 61 73 20 73 75  wid value was su
13810 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20 69 66  pplied, check if
13820 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
13830 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a  resent in .    *
13840 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  * the table. If 
13850 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  so, the constrai
13860 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  nt has failed. *
13870 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13880 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 7a 44  3_value_type(azD
13890 61 74 61 5b 32 5d 29 21 3d 53 51 4c 49 54 45 5f  ata[2])!=SQLITE_
138a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 63 65  NULL ){.      ce
138b0 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  ll.iRowid = sqli
138c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
138d0 61 7a 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20 20  azData[2]);.    
138e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
138f0 6c 75 65 5f 74 79 70 65 28 61 7a 44 61 74 61 5b  lue_type(azData[
13900 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
13910 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
13920 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
13930 7a 44 61 74 61 5b 30 5d 29 21 3d 63 65 6c 6c 2e  zData[0])!=cell.
13940 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 7b 0a  iRowid.      ){.
13950 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 65 70          int step
13960 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rc;.        sqli
13970 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
13980 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
13990 64 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77 69  d, 1, cell.iRowi
139a0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 74 65 70  d);.        step
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
139c0 70 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  p(pRtree->pReadR
139d0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 72  owid);.        r
139e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
139f0 74 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52  t(pRtree->pReadR
13a00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  owid);.        i
13a10 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
13a20 74 65 70 72 63 20 29 7b 0a 20 20 20 20 20 20 20  teprc ){.       
13a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
13a40 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28  tab_on_conflict(
13a50 70 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c  pRtree->db)==SQL
13a60 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20  ITE_REPLACE ){. 
13a70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
13a80 72 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64  rtreeDeleteRowid
13a90 28 70 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52  (pRtree, cell.iR
13aa0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
13ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13ad0 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
13ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6e          goto con
13af0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 20  straint;.       
13b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 48 61       }.      bHa
13b20 76 65 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  veRowid = 1;.   
13b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13b40 61 7a 44 61 74 61 5b 30 5d 20 69 73 20 6e 6f 74  azData[0] is not
13b50 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
13b60 75 65 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f  ue, it is the ro
13b70 77 69 64 20 6f 66 20 61 0a 20 20 2a 2a 20 72 65  wid of a.  ** re
13b80 63 6f 72 64 20 74 6f 20 64 65 6c 65 74 65 20 66  cord to delete f
13b90 72 6f 6d 20 74 68 65 20 72 2d 74 72 65 65 20 74  rom the r-tree t
13ba0 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
13bb0 69 6e 67 20 62 6c 6f 63 6b 20 64 6f 65 73 0a 20  ing block does. 
13bc0 20 2a 2a 20 6a 75 73 74 20 74 68 61 74 2e 0a 20   ** just that.. 
13bd0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13be0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 7a 44  3_value_type(azD
13bf0 61 74 61 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f  ata[0])!=SQLITE_
13c00 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
13c10 20 72 74 72 65 65 44 65 6c 65 74 65 52 6f 77 69   rtreeDeleteRowi
13c20 64 28 70 52 74 72 65 65 2c 20 73 71 6c 69 74 65  d(pRtree, sqlite
13c30 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 7a  3_value_int64(az
13c40 44 61 74 61 5b 30 5d 29 29 3b 0a 20 20 7d 0a 0a  Data[0]));.  }..
13c50 20 20 2f 2a 20 49 66 20 74 68 65 20 61 7a 44 61    /* If the azDa
13c60 74 61 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ta[] array conta
13c70 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ins more than on
13c80 65 20 65 6c 65 6d 65 6e 74 2c 20 65 6c 65 6d 65  e element, eleme
13c90 6e 74 73 0a 20 20 2a 2a 20 28 61 7a 44 61 74 61  nts.  ** (azData
13ca0 5b 32 5d 2e 2e 61 7a 44 61 74 61 5b 61 72 67 63  [2]..azData[argc
13cb0 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20 61 20 6e  -1]) contain a n
13cc0 65 77 20 72 65 63 6f 72 64 20 74 6f 20 69 6e 73  ew record to ins
13cd0 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ert into.  ** th
13ce0 65 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75  e r-tree structu
13cf0 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  re..  */.  if( r
13d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13d10 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 2f  nData>1 ){.    /
13d20 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
13d30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
13d40 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 52   r-tree */.    R
13d50 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66 20  treeNode *pLeaf 
13d60 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  = 0;..    /* Fig
13d70 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 77 69  ure out the rowi
13d80 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
13d90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 48 61  . */.    if( bHa
13da0 76 65 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20  veRowid==0 ){.  
13db0 20 20 20 20 72 63 20 3d 20 6e 65 77 52 6f 77 69      rc = newRowi
13dc0 64 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2e  d(pRtree, &cell.
13dd0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iRowid);.    }. 
13de0 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c     *pRowid = cel
13df0 6c 2e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69  l.iRowid;..    i
13e00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13e10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 43   ){.      rc = C
13e20 68 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65  hooseLeaf(pRtree
13e30 2c 20 26 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65  , &cell, 0, &pLe
13e40 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  af);.    }.    i
13e50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13e60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
13e70 32 3b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d  2;.      pRtree-
13e80 3e 69 52 65 69 6e 73 65 72 74 48 65 69 67 68 74  >iReinsertHeight
13e90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20   = -1;.      rc 
13ea0 3d 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c  = rtreeInsertCel
13eb0 6c 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 2c  l(pRtree, pLeaf,
13ec0 20 26 63 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   &cell, 0);.    
13ed0 20 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65    rc2 = nodeRele
13ee0 61 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65 61  ase(pRtree, pLea
13ef0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
13f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13f10 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
13f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13f30 20 7d 0a 0a 63 6f 6e 73 74 72 61 69 6e 74 3a 0a   }..constraint:.
13f40 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70    rtreeRelease(p
13f50 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  Rtree);.  return
13f60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
13f70 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
13f80 20 66 6f 72 20 72 74 72 65 65 20 6d 6f 64 75 6c   for rtree modul
13f90 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  e virtual tables
13fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13fb0 72 74 72 65 65 52 65 6e 61 6d 65 28 73 71 6c 69  rtreeRename(sqli
13fc0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
13fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
13fe0 77 4e 61 6d 65 29 7b 0a 20 20 52 74 72 65 65 20  wName){.  Rtree 
13ff0 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72 65 65  *pRtree = (Rtree
14000 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20   *)pVtab;.  int 
14010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14020 4d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  M;.  char *zSql 
14030 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
14040 66 28 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  f(.    "ALTER TA
14050 42 4c 45 20 25 51 2e 27 25 71 5f 6e 6f 64 65 27  BLE %Q.'%q_node'
14060 20 20 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25     RENAME TO \"%
14070 77 5f 6e 6f 64 65 5c 22 3b 22 0a 20 20 20 20 22  w_node\";".    "
14080 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
14090 25 71 5f 70 61 72 65 6e 74 27 20 52 45 4e 41 4d  %q_parent' RENAM
140a0 45 20 54 4f 20 5c 22 25 77 5f 70 61 72 65 6e 74  E TO \"%w_parent
140b0 5c 22 3b 22 0a 20 20 20 20 22 41 4c 54 45 52 20  \";".    "ALTER 
140c0 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 72 6f 77  TABLE %Q.'%q_row
140d0 69 64 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 5c  id'  RENAME TO \
140e0 22 25 77 5f 72 6f 77 69 64 5c 22 3b 22 0a 20 20  "%w_rowid\";".  
140f0 20 20 2c 20 70 52 74 72 65 65 2d 3e 7a 44 62 2c    , pRtree->zDb,
14100 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20   pRtree->zName, 
14110 7a 4e 65 77 4e 61 6d 65 20 0a 20 20 20 20 2c 20  zNewName .    , 
14120 70 52 74 72 65 65 2d 3e 7a 44 62 2c 20 70 52 74  pRtree->zDb, pRt
14130 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77  ree->zName, zNew
14140 4e 61 6d 65 20 0a 20 20 20 20 2c 20 70 52 74 72  Name .    , pRtr
14150 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
14160 3e 7a 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  >zName, zNewName
14170 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  .  );.  if( zSql
14180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14190 69 74 65 33 5f 65 78 65 63 28 70 52 74 72 65 65  ite3_exec(pRtree
141a0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
141b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
141c0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
141d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
141e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
141f0 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20  ction populates 
14200 74 68 65 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77  the pRtree->nRow
14210 45 73 74 20 76 61 72 69 61 62 6c 65 20 77 69 74  Est variable wit
14220 68 20 61 6e 20 65 73 74 69 6d 61 74 65 0a 2a 2a  h an estimate.**
14230 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
14240 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69  f rows in the vi
14250 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 66 20  rtual table. If 
14260 70 6f 73 73 69 62 6c 65 2c 20 74 68 69 73 20 69  possible, this i
14270 73 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 73 71  s based.** on sq
14280 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 2e  lite_stat1 data.
14290 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
142a0 52 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 52 4f  RTREE_DEFAULT_RO
142b0 57 45 53 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  WEST..*/.static 
142c0 69 6e 74 20 72 74 72 65 65 51 75 65 72 79 53 74  int rtreeQuerySt
142d0 61 74 31 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  at1(sqlite3 *db,
142e0 20 52 74 72 65 65 20 2a 70 52 74 72 65 65 29 7b   Rtree *pRtree){
142f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14300 46 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 73 74  Fmt = "SELECT st
14310 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
14320 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
14330 6c 20 3d 20 27 25 71 5f 72 6f 77 69 64 27 22 3b  l = '%q_rowid'";
14340 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
14350 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14360 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36  ;.  int rc;.  i6
14370 34 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 7a  4 nRow = 0;..  z
14380 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
14390 72 69 6e 74 66 28 7a 46 6d 74 2c 20 70 52 74 72  rintf(zFmt, pRtr
143a0 65 65 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d  ee->zDb, pRtree-
143b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  >zName);.  if( z
143c0 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Sql==0 ){.    rc
143d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
143e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
143f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
14400 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
14410 2d 31 2c 20 26 70 2c 20 30 29 3b 0a 20 20 20 20  -1, &p, 0);.    
14420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14430 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  K ){.      if( s
14440 71 6c 69 74 65 33 5f 73 74 65 70 28 70 29 3d 3d  qlite3_step(p)==
14450 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 6e 52 6f  SQLITE_ROW ) nRo
14460 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  w = sqlite3_colu
14470 6d 6e 5f 69 6e 74 36 34 28 70 2c 20 30 29 3b 0a  mn_int64(p, 0);.
14480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14490 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 29 3b 0a  e3_finalize(p);.
144a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
144b0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
144c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
144d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
144e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
144f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
14500 28 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  ( nRow==0 ){.   
14510 20 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 52 6f       pRtree->nRo
14520 77 45 73 74 20 3d 20 52 54 52 45 45 5f 44 45 46  wEst = RTREE_DEF
14530 41 55 4c 54 5f 52 4f 57 45 53 54 3b 0a 20 20 20  AULT_ROWEST;.   
14540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14550 20 20 70 52 74 72 65 65 2d 3e 6e 52 6f 77 45 73    pRtree->nRowEs
14560 74 20 3d 20 4d 41 58 28 6e 52 6f 77 2c 20 52 54  t = MAX(nRow, RT
14570 52 45 45 5f 4d 49 4e 5f 52 4f 57 45 53 54 29 3b  REE_MIN_ROWEST);
14580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
145a0 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  zSql);.  }..  re
145b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
145c0 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
145d0 65 20 72 74 72 65 65 4d 6f 64 75 6c 65 20 3d 20  e rtreeModule = 
145e0 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
14610 20 72 74 72 65 65 43 72 65 61 74 65 2c 20 20 20   rtreeCreate,   
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14630 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74 65  xCreate - create
14640 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74   a table */.  rt
14650 72 65 65 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  reeConnect,     
14660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
14670 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20  nnect - connect 
14680 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  to an existing t
14690 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 42  able */.  rtreeB
146a0 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
146b0 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
146c0 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20  dex - Determine 
146d0 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20  search strategy 
146e0 2a 2f 0a 20 20 72 74 72 65 65 44 69 73 63 6f 6e  */.  rtreeDiscon
146f0 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
14700 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
14710 2d 20 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f  - Disconnect fro
14720 6d 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72  m a table */.  r
14730 74 72 65 65 44 65 73 74 72 6f 79 2c 20 20 20 20  treeDestroy,    
14740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
14750 65 73 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20  estroy - Drop a 
14760 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65  table */.  rtree
14770 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
14780 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
14790 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
147a0 2a 2f 0a 20 20 72 74 72 65 65 43 6c 6f 73 65 2c  */.  rtreeClose,
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
147d0 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
147e0 20 72 74 72 65 65 46 69 6c 74 65 72 2c 20 20 20   rtreeFilter,   
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14800 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
14810 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
14820 69 6e 74 73 20 2a 2f 0a 20 20 72 74 72 65 65 4e  ints */.  rtreeN
14830 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
14840 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
14850 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
14860 72 20 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66 2c  r */.  rtreeEof,
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20     /* xEof */.  
14890 72 74 72 65 65 43 6f 6c 75 6d 6e 2c 20 20 20 20  rtreeColumn,    
148a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
148b0 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61  Column - read da
148c0 74 61 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f 77  ta */.  rtreeRow
148d0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
148e0 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
148f0 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 72  read data */.  r
14900 74 72 65 65 55 70 64 61 74 65 2c 20 20 20 20 20  treeUpdate,     
14910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
14920 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61  pdate - write da
14930 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
14960 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
14970 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79     /* xSync - sy
149a0 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nc transaction *
149b0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d  /* xCommit - com
149e0 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mit transaction 
149f0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20   /* xRollback - 
14a20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63  rollback transac
14a30 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  tion */.  0,    
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75        /* xFindFu
14a60 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f  nction - functio
14a70 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f  n overloading */
14a80 0a 20 20 72 74 72 65 65 52 65 6e 61 6d 65 2c 20  .  rtreeRename, 
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14aa0 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61  * xRename - rena
14ab0 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  me the table */.
14ac0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ae0 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20   xSavepoint */. 
14af0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b10 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20  xRelease */.  0 
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
14b40 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a  llbackTo */.};..
14b50 73 74 61 74 69 63 20 69 6e 74 20 72 74 72 65 65  static int rtree
14b60 53 71 6c 49 6e 69 74 28 0a 20 20 52 74 72 65 65  SqlInit(.  Rtree
14b70 20 2a 70 52 74 72 65 65 2c 20 0a 20 20 73 71 6c   *pRtree, .  sql
14b80 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e  ite3 *db, .  con
14b90 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
14ba0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
14bb0 65 66 69 78 2c 20 0a 20 20 69 6e 74 20 69 73 43  efix, .  int isC
14bc0 72 65 61 74 65 0a 29 7b 0a 20 20 69 6e 74 20 72  reate.){.  int r
14bd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
14be0 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 54 41 54    #define N_STAT
14bf0 45 4d 45 4e 54 20 39 0a 20 20 73 74 61 74 69 63  EMENT 9.  static
14c00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
14c10 71 6c 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d 20  ql[N_STATEMENT] 
14c20 3d 20 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  = {.    /* Read 
14c30 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 78 78  and write the xx
14c40 78 5f 6e 6f 64 65 20 74 61 62 6c 65 20 2a 2f 0a  x_node table */.
14c50 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 61      "SELECT data
14c60 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e   FROM '%q'.'%q_n
14c70 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e  ode' WHERE noden
14c80 6f 20 3d 20 3a 31 22 2c 0a 20 20 20 20 22 49 4e  o = :1",.    "IN
14c90 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
14ca0 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 6e 6f  INTO '%q'.'%q_no
14cb0 64 65 27 20 56 41 4c 55 45 53 28 3a 31 2c 20 3a  de' VALUES(:1, :
14cc0 32 29 22 2c 0a 20 20 20 20 22 44 45 4c 45 54 45  2)",.    "DELETE
14cd0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 6e   FROM '%q'.'%q_n
14ce0 6f 64 65 27 20 57 48 45 52 45 20 6e 6f 64 65 6e  ode' WHERE noden
14cf0 6f 20 3d 20 3a 31 22 2c 0a 0a 20 20 20 20 2f 2a  o = :1",..    /*
14d00 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
14d10 74 68 65 20 78 78 78 5f 72 6f 77 69 64 20 74 61  the xxx_rowid ta
14d20 62 6c 65 20 2a 2f 0a 20 20 20 20 22 53 45 4c 45  ble */.    "SELE
14d30 43 54 20 6e 6f 64 65 6e 6f 20 46 52 4f 4d 20 27  CT nodeno FROM '
14d40 25 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 57  %q'.'%q_rowid' W
14d50 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3a 31 22  HERE rowid = :1"
14d60 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  ,.    "INSERT OR
14d70 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25   REPLACE INTO '%
14d80 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20 56 41  q'.'%q_rowid' VA
14d90 4c 55 45 53 28 3a 31 2c 20 3a 32 29 22 2c 0a 20  LUES(:1, :2)",. 
14da0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
14db0 27 25 71 27 2e 27 25 71 5f 72 6f 77 69 64 27 20  '%q'.'%q_rowid' 
14dc0 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3a 31  WHERE rowid = :1
14dd0 22 2c 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ",..    /* Read 
14de0 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 78 78  and write the xx
14df0 78 5f 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a  x_parent table *
14e00 2f 0a 20 20 20 20 22 53 45 4c 45 43 54 20 70 61  /.    "SELECT pa
14e10 72 65 6e 74 6e 6f 64 65 20 46 52 4f 4d 20 27 25  rentnode FROM '%
14e20 71 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20 57  q'.'%q_parent' W
14e30 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 3a 31  HERE nodeno = :1
14e40 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 20 4f  ",.    "INSERT O
14e50 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27  R REPLACE INTO '
14e60 25 71 27 2e 27 25 71 5f 70 61 72 65 6e 74 27 20  %q'.'%q_parent' 
14e70 56 41 4c 55 45 53 28 3a 31 2c 20 3a 32 29 22 2c  VALUES(:1, :2)",
14e80 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f  .    "DELETE FRO
14e90 4d 20 27 25 71 27 2e 27 25 71 5f 70 61 72 65 6e  M '%q'.'%q_paren
14ea0 74 27 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f 20  t' WHERE nodeno 
14eb0 3d 20 3a 31 22 0a 20 20 7d 3b 0a 20 20 73 71 6c  = :1".  };.  sql
14ec0 69 74 65 33 5f 73 74 6d 74 20 2a 2a 61 70 70 53  ite3_stmt **appS
14ed0 74 6d 74 5b 4e 5f 53 54 41 54 45 4d 45 4e 54 5d  tmt[N_STATEMENT]
14ee0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 70 52  ;.  int i;..  pR
14ef0 74 72 65 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a  tree->db = db;..
14f00 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
14f10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65  {.    char *zCre
14f20 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
14f30 72 69 6e 74 66 28 0a 22 43 52 45 41 54 45 20 54  rintf(."CREATE T
14f40 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77  ABLE \"%w\".\"%w
14f50 5f 6e 6f 64 65 5c 22 28 6e 6f 64 65 6e 6f 20 49  _node\"(nodeno I
14f60 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
14f70 45 59 2c 20 64 61 74 61 20 42 4c 4f 42 29 3b 22  EY, data BLOB);"
14f80 0a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c  ."CREATE TABLE \
14f90 22 25 77 5c 22 2e 5c 22 25 77 5f 72 6f 77 69 64  "%w\".\"%w_rowid
14fa0 5c 22 28 72 6f 77 69 64 20 49 4e 54 45 47 45 52  \"(rowid INTEGER
14fb0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6e 6f   PRIMARY KEY, no
14fc0 64 65 6e 6f 20 49 4e 54 45 47 45 52 29 3b 22 0a  deno INTEGER);".
14fd0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
14fe0 25 77 5c 22 2e 5c 22 25 77 5f 70 61 72 65 6e 74  %w\".\"%w_parent
14ff0 5c 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45  \"(nodeno INTEGE
15000 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70  R PRIMARY KEY, p
15010 61 72 65 6e 74 6e 6f 64 65 20 49 4e 54 45 47 45  arentnode INTEGE
15020 52 29 3b 22 0a 22 49 4e 53 45 52 54 20 49 4e 54  R);"."INSERT INT
15030 4f 20 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27  O '%q'.'%q_node'
15040 20 56 41 4c 55 45 53 28 31 2c 20 7a 65 72 6f 62   VALUES(1, zerob
15050 6c 6f 62 28 25 64 29 29 22 2c 0a 20 20 20 20 20  lob(%d))",.     
15060 20 7a 44 62 2c 20 7a 50 72 65 66 69 78 2c 20 7a   zDb, zPrefix, z
15070 44 62 2c 20 7a 50 72 65 66 69 78 2c 20 7a 44 62  Db, zPrefix, zDb
15080 2c 20 7a 50 72 65 66 69 78 2c 20 7a 44 62 2c 20  , zPrefix, zDb, 
15090 7a 50 72 65 66 69 78 2c 20 70 52 74 72 65 65 2d  zPrefix, pRtree-
150a0 3e 69 4e 6f 64 65 53 69 7a 65 0a 20 20 20 20 29  >iNodeSize.    )
150b0 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 72 65 61  ;.    if( !zCrea
150c0 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  te ){.      retu
150d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
150e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
150f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
15100 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
15110 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
15120 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
15130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15150 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15160 20 7d 0a 0a 20 20 61 70 70 53 74 6d 74 5b 30 5d   }..  appStmt[0]
15170 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 52 65 61   = &pRtree->pRea
15180 64 4e 6f 64 65 3b 0a 20 20 61 70 70 53 74 6d 74  dNode;.  appStmt
15190 5b 31 5d 20 3d 20 26 70 52 74 72 65 65 2d 3e 70  [1] = &pRtree->p
151a0 57 72 69 74 65 4e 6f 64 65 3b 0a 20 20 61 70 70  WriteNode;.  app
151b0 53 74 6d 74 5b 32 5d 20 3d 20 26 70 52 74 72 65  Stmt[2] = &pRtre
151c0 65 2d 3e 70 44 65 6c 65 74 65 4e 6f 64 65 3b 0a  e->pDeleteNode;.
151d0 20 20 61 70 70 53 74 6d 74 5b 33 5d 20 3d 20 26    appStmt[3] = &
151e0 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
151f0 69 64 3b 0a 20 20 61 70 70 53 74 6d 74 5b 34 5d  id;.  appStmt[4]
15200 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69   = &pRtree->pWri
15210 74 65 52 6f 77 69 64 3b 0a 20 20 61 70 70 53 74  teRowid;.  appSt
15220 6d 74 5b 35 5d 20 3d 20 26 70 52 74 72 65 65 2d  mt[5] = &pRtree-
15230 3e 70 44 65 6c 65 74 65 52 6f 77 69 64 3b 0a 20  >pDeleteRowid;. 
15240 20 61 70 70 53 74 6d 74 5b 36 5d 20 3d 20 26 70   appStmt[6] = &p
15250 52 74 72 65 65 2d 3e 70 52 65 61 64 50 61 72 65  Rtree->pReadPare
15260 6e 74 3b 0a 20 20 61 70 70 53 74 6d 74 5b 37 5d  nt;.  appStmt[7]
15270 20 3d 20 26 70 52 74 72 65 65 2d 3e 70 57 72 69   = &pRtree->pWri
15280 74 65 50 61 72 65 6e 74 3b 0a 20 20 61 70 70 53  teParent;.  appS
15290 74 6d 74 5b 38 5d 20 3d 20 26 70 52 74 72 65 65  tmt[8] = &pRtree
152a0 2d 3e 70 44 65 6c 65 74 65 50 61 72 65 6e 74 3b  ->pDeleteParent;
152b0 0a 0a 20 20 72 63 20 3d 20 72 74 72 65 65 51 75  ..  rc = rtreeQu
152c0 65 72 79 53 74 61 74 31 28 64 62 2c 20 70 52 74  eryStat1(db, pRt
152d0 72 65 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ree);.  for(i=0;
152e0 20 69 3c 4e 5f 53 54 41 54 45 4d 45 4e 54 20 26   i<N_STATEMENT &
152f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
15300 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
15310 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
15320 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 69 5d  mprintf(azSql[i]
15330 2c 20 7a 44 62 2c 20 7a 50 72 65 66 69 78 29 3b  , zDb, zPrefix);
15340 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
15350 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15360 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
15370 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 61 70 70  b, zSql, -1, app
15380 53 74 6d 74 5b 69 5d 2c 20 30 29 3b 20 0a 20 20  Stmt[i], 0); .  
15390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
153a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
153b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
153c0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
153d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
153e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
153f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
15400 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
15410 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
15420 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
15430 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65  ement.** that re
15440 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 69  turns a single i
15450 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 54 68  nteger value. Th
15460 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63  e statement is c
15470 6f 6d 70 69 6c 65 64 20 61 6e 64 20 65 78 65 63  ompiled and exec
15480 75 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 64 61  uted.** using da
15490 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
154a0 6e 20 64 62 2e 20 49 66 20 73 75 63 63 65 73 73  n db. If success
154b0 66 75 6c 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ful, the integer
154c0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 0a   value returned.
154d0 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
154e0 20 2a 70 69 56 61 6c 20 61 6e 64 20 53 51 4c 49   *piVal and SQLI
154f0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
15500 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
15510 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
15520 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
15530 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
15540 2a 70 69 56 61 6c 20 61 66 74 65 72 20 72 65 74  *piVal after ret
15550 75 72 6e 69 6e 67 20 69 73 20 6e 6f 74 20 64 65  urning is not de
15560 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
15570 20 69 6e 74 20 67 65 74 49 6e 74 46 72 6f 6d 53   int getIntFromS
15580 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
15590 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
155a0 6c 2c 20 69 6e 74 20 2a 70 69 56 61 6c 29 7b 0a  l, int *piVal){.
155b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
155c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 7a  E_NOMEM;.  if( z
155d0 53 71 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Sql ){.    sqlit
155e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
155f0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
15600 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
15610 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
15620 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
15630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
15650 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
15660 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
15670 20 20 20 20 20 20 20 20 2a 70 69 56 61 6c 20 3d          *piVal =
15680 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15690 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
156a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
156b0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
156c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
156d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
156e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
156f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15700 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
15710 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 6f 72  he xConnect() or
15720 20 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f   xCreate() metho
15730 64 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  d to.** determin
15740 65 20 74 68 65 20 6e 6f 64 65 2d 73 69 7a 65 20  e the node-size 
15750 75 73 65 64 20 62 79 20 74 68 65 20 72 74 72 65  used by the rtre
15760 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 72  e table being cr
15770 65 61 74 65 64 20 6f 72 20 63 6f 6e 6e 65 63 74  eated or connect
15780 65 64 0a 2a 2a 20 74 6f 2e 20 49 66 20 73 75 63  ed.** to. If suc
15790 63 65 73 73 66 75 6c 2c 20 70 52 74 72 65 65 2d  cessful, pRtree-
157a0 3e 69 4e 6f 64 65 53 69 7a 65 20 69 73 20 70 6f  >iNodeSize is po
157b0 70 75 6c 61 74 65 64 20 61 6e 64 20 53 51 4c 49  pulated and SQLI
157c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
157d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
157e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
157f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
15800 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
15810 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
15820 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
15830 66 20 61 6e 20 78 43 6f 6e 6e 65 63 74 28 29 2c  f an xConnect(),
15840 20 74 68 65 6e 20 74 68 65 20 72 74 72 65 65 0a   then the rtree.
15850 2a 2a 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  ** table already
15860 20 65 78 69 73 74 73 2e 20 49 6e 20 74 68 69 73   exists. In this
15870 20 63 61 73 65 20 74 68 65 20 6e 6f 64 65 2d 73   case the node-s
15880 69 7a 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ize is determine
15890 64 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 0a  d by inspecting.
158a0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ** the root node
158b0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   of the tree..**
158c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
158d0 6f 72 20 61 6e 20 78 43 72 65 61 74 65 28 29 2c  or an xCreate(),
158e0 20 75 73 65 20 36 34 20 62 79 74 65 73 20 6c 65   use 64 bytes le
158f0 73 73 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  ss than the data
15900 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 2e 20  base page-size. 
15910 0a 2a 2a 20 54 68 69 73 20 65 6e 73 75 72 65 73  .** This ensures
15920 20 74 68 61 74 20 65 61 63 68 20 6e 6f 64 65 20   that each node 
15930 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 73  is stored on a s
15940 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 70  ingle database p
15950 61 67 65 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  age. If the .** 
15960 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69  database page-si
15970 7a 65 20 69 73 20 73 6f 20 6c 61 72 67 65 20 74  ze is so large t
15980 68 61 74 20 6d 6f 72 65 20 74 68 61 6e 20 52 54  hat more than RT
15990 52 45 45 5f 4d 41 58 43 45 4c 4c 53 20 65 6e 74  REE_MAXCELLS ent
159a0 72 69 65 73 20 0a 2a 2a 20 77 6f 75 6c 64 20 66  ries .** would f
159b0 69 74 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 6e  it in a single n
159c0 6f 64 65 2c 20 75 73 65 20 61 20 73 6d 61 6c 6c  ode, use a small
159d0 65 72 20 6e 6f 64 65 2d 73 69 7a 65 2e 0a 2a 2f  er node-size..*/
159e0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4e  .static int getN
159f0 6f 64 65 53 69 7a 65 28 0a 20 20 73 71 6c 69 74  odeSize(.  sqlit
15a00 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
15a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
15a20 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
15a30 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72 65 65  .  Rtree *pRtree
15a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15a50 20 20 20 2f 2a 20 52 74 72 65 65 20 68 61 6e 64     /* Rtree hand
15a60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 72  le */.  int isCr
15a70 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
15a80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15a90 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61 6c  for xCreate, fal
15aa0 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20  se for xConnect 
15ab0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
15ac0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
15ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
15ae0 6f 72 20 6d 65 73 73 61 67 65 2c 20 69 66 20 61  or message, if a
15af0 6e 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ny */.){.  int r
15b00 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
15b10 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
15b20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
15b30 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7a 53  Size = 0;.    zS
15b40 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
15b50 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51 2e  intf("PRAGMA %Q.
15b60 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 52 74 72  page_size", pRtr
15b70 65 65 2d 3e 7a 44 62 29 3b 0a 20 20 20 20 72 63  ee->zDb);.    rc
15b80 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d 53 74 6d   = getIntFromStm
15b90 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26 69 50 61  t(db, zSql, &iPa
15ba0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
15bb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15bc0 7b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e  {.      pRtree->
15bd0 69 4e 6f 64 65 53 69 7a 65 20 3d 20 69 50 61 67  iNodeSize = iPag
15be0 65 53 69 7a 65 2d 36 34 3b 0a 20 20 20 20 20 20  eSize-64;.      
15bf0 69 66 28 20 28 34 2b 70 52 74 72 65 65 2d 3e 6e  if( (4+pRtree->n
15c00 42 79 74 65 73 50 65 72 43 65 6c 6c 2a 52 54 52  BytesPerCell*RTR
15c10 45 45 5f 4d 41 58 43 45 4c 4c 53 29 3c 70 52 74  EE_MAXCELLS)<pRt
15c20 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 29  ree->iNodeSize )
15c30 7b 0a 20 20 20 20 20 20 20 20 70 52 74 72 65 65  {.        pRtree
15c40 2d 3e 69 4e 6f 64 65 53 69 7a 65 20 3d 20 34 2b  ->iNodeSize = 4+
15c50 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73 50 65  pRtree->nBytesPe
15c60 72 43 65 6c 6c 2a 52 54 52 45 45 5f 4d 41 58 43  rCell*RTREE_MAXC
15c70 45 4c 4c 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ELLS;.      }.  
15c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
15c90 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
15ca0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
15cb0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
15cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
15cd0 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  {.    zSql = sql
15ce0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
15cf0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6c 65        "SELECT le
15d00 6e 67 74 68 28 64 61 74 61 29 20 46 52 4f 4d 20  ngth(data) FROM 
15d10 27 25 71 27 2e 27 25 71 5f 6e 6f 64 65 27 20 57  '%q'.'%q_node' W
15d20 48 45 52 45 20 6e 6f 64 65 6e 6f 20 3d 20 31 22  HERE nodeno = 1"
15d30 2c 0a 20 20 20 20 20 20 20 20 70 52 74 72 65 65  ,.        pRtree
15d40 2d 3e 7a 44 62 2c 20 70 52 74 72 65 65 2d 3e 7a  ->zDb, pRtree->z
15d50 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
15d60 72 63 20 3d 20 67 65 74 49 6e 74 46 72 6f 6d 53  rc = getIntFromS
15d70 74 6d 74 28 64 62 2c 20 7a 53 71 6c 2c 20 26 70  tmt(db, zSql, &p
15d80 52 74 72 65 65 2d 3e 69 4e 6f 64 65 53 69 7a 65  Rtree->iNodeSize
15d90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15db0 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
15dc0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
15dd0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
15de0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  db));.    }.  }.
15df0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15e00 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSql);.  return 
15e10 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
15e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
15e30 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
15e40 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20 78 43  n of both the xC
15e50 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61  onnect and xCrea
15e60 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 6f 66  te.** methods of
15e70 20 74 68 65 20 72 2d 74 72 65 65 20 76 69 72 74   the r-tree virt
15e80 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
15e90 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20     argv[0]   -> 
15ea0 6d 6f 64 75 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20  module name.**  
15eb0 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61   argv[1]   -> da
15ec0 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20  tabase name.**  
15ed0 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61   argv[2]   -> ta
15ee0 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ble name.**   ar
15ef0 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 63 6f 6c 75 6d  gv[...] -> colum
15f00 6e 20 6e 61 6d 65 73 2e 2e 2e 0a 2a 2f 0a 73 74  n names....*/.st
15f10 61 74 69 63 20 69 6e 74 20 72 74 72 65 65 49 6e  atic int rtreeIn
15f20 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
15f30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
15f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
15f50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15f60 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
15f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
15f90 20 6f 66 20 74 68 65 20 52 54 52 45 45 5f 43 4f   of the RTREE_CO
15fa0 4f 52 44 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  ORD_* constants 
15fb0 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  */.  int argc, c
15fc0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
15fd0 2a 61 72 67 76 2c 20 20 20 2f 2a 20 50 61 72 61  *argv,   /* Para
15fe0 6d 65 74 65 72 73 20 74 6f 20 43 52 45 41 54 45  meters to CREATE
15ff0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
16000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74   */.  sqlite3_vt
16010 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20  ab **ppVtab,    
16020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16030 3a 20 4e 65 77 20 76 69 72 74 75 61 6c 20 74 61  : New virtual ta
16040 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ble */.  char **
16050 70 7a 45 72 72 2c 20 20 20 20 20 20 20 20 20 20  pzErr,          
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16070 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
16080 67 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ge, if any */.  
16090 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
160c0 78 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66  xCreate, false f
160d0 6f 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29  or xConnect */.)
160e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
160f0 49 54 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 20  ITE_OK;.  Rtree 
16100 2a 70 52 74 72 65 65 3b 0a 20 20 69 6e 74 20 6e  *pRtree;.  int n
16110 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16120 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
16130 72 69 6e 67 20 61 72 67 76 5b 31 5d 20 2a 2f 0a  ring argv[1] */.
16140 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
16150 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
16160 68 20 6f 66 20 73 74 72 69 6e 67 20 61 72 67 76  h of string argv
16170 5b 32 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 43 6f  [2] */.  int eCo
16180 6f 72 64 54 79 70 65 20 3d 20 28 70 41 75 78 20  ordType = (pAux 
16190 3f 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e  ? RTREE_COORD_IN
161a0 54 33 32 20 3a 20 52 54 52 45 45 5f 43 4f 4f 52  T32 : RTREE_COOR
161b0 44 5f 52 45 41 4c 33 32 29 3b 0a 0a 20 20 63 6f  D_REAL32);..  co
161c0 6e 73 74 20 63 68 61 72 20 2a 61 45 72 72 4d 73  nst char *aErrMs
161d0 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20  g[] = {.    0,  
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 22 57    /* 0 */.    "W
16220 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 63  rong number of c
16230 6f 6c 75 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74  olumns for an rt
16240 72 65 65 20 74 61 62 6c 65 22 2c 20 20 20 20 20  ree table",     
16250 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
16260 22 54 6f 6f 20 66 65 77 20 63 6f 6c 75 6d 6e 73  "Too few columns
16270 20 66 6f 72 20 61 6e 20 72 74 72 65 65 20 74 61   for an rtree ta
16280 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ble",           
16290 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20        /* 2 */.  
162a0 20 20 22 54 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75    "Too many colu
162b0 6d 6e 73 20 66 6f 72 20 61 6e 20 72 74 72 65 65  mns for an rtree
162c0 20 74 61 62 6c 65 22 20 20 20 20 20 20 20 20 20   table"         
162d0 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a          /* 3 */.
162e0 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 45 72 72    };..  int iErr
162f0 20 3d 20 28 61 72 67 63 3c 36 29 20 3f 20 32 20   = (argc<6) ? 2 
16300 3a 20 61 72 67 63 3e 28 52 54 52 45 45 5f 4d 41  : argc>(RTREE_MA
16310 58 5f 44 49 4d 45 4e 53 49 4f 4e 53 2a 32 2b 34  X_DIMENSIONS*2+4
16320 29 20 3f 20 33 20 3a 20 61 72 67 63 25 32 3b 0a  ) ? 3 : argc%2;.
16330 20 20 69 66 28 20 61 45 72 72 4d 73 67 5b 69 45    if( aErrMsg[iE
16340 72 72 5d 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  rr] ){.    *pzEr
16350 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
16360 6e 74 66 28 22 25 73 22 2c 20 61 45 72 72 4d 73  ntf("%s", aErrMs
16370 67 5b 69 45 72 72 5d 29 3b 0a 20 20 20 20 72 65  g[iErr]);.    re
16380 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16390 52 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  R;.  }..  sqlite
163a0 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28 64 62  3_vtab_config(db
163b0 2c 20 53 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f  , SQLITE_VTAB_CO
163c0 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f 52 54  NSTRAINT_SUPPORT
163d0 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 1);..  /* Allo
163e0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
163f0 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20  _vtab structure 
16400 2a 2f 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74 29  */.  nDb = (int)
16410 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 3b  strlen(argv[1]);
16420 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29  .  nName = (int)
16430 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29 3b  strlen(argv[2]);
16440 0a 20 20 70 52 74 72 65 65 20 3d 20 28 52 74 72  .  pRtree = (Rtr
16450 65 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ee *)sqlite3_mal
16460 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65  loc(sizeof(Rtree
16470 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a  )+nDb+nName+2);.
16480 20 20 69 66 28 20 21 70 52 74 72 65 65 20 29 7b    if( !pRtree ){
16490 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
164a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
164b0 6d 65 6d 73 65 74 28 70 52 74 72 65 65 2c 20 30  memset(pRtree, 0
164c0 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65 29 2b  , sizeof(Rtree)+
164d0 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a 20 20  nDb+nName+2);.  
164e0 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 20 3d 20  pRtree->nBusy = 
164f0 31 3b 0a 20 20 70 52 74 72 65 65 2d 3e 62 61 73  1;.  pRtree->bas
16500 65 2e 70 4d 6f 64 75 6c 65 20 3d 20 26 72 74 72  e.pModule = &rtr
16510 65 65 4d 6f 64 75 6c 65 3b 0a 20 20 70 52 74 72  eeModule;.  pRtr
16520 65 65 2d 3e 7a 44 62 20 3d 20 28 63 68 61 72 20  ee->zDb = (char 
16530 2a 29 26 70 52 74 72 65 65 5b 31 5d 3b 0a 20 20  *)&pRtree[1];.  
16540 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pRtree->zName = 
16550 26 70 52 74 72 65 65 2d 3e 7a 44 62 5b 6e 44 62  &pRtree->zDb[nDb
16560 2b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e  +1];.  pRtree->n
16570 44 69 6d 20 3d 20 28 61 72 67 63 2d 34 29 2f 32  Dim = (argc-4)/2
16580 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 42 79 74  ;.  pRtree->nByt
16590 65 73 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20  esPerCell = 8 + 
165a0 70 52 74 72 65 65 2d 3e 6e 44 69 6d 2a 34 2a 32  pRtree->nDim*4*2
165b0 3b 0a 20 20 70 52 74 72 65 65 2d 3e 65 43 6f 6f  ;.  pRtree->eCoo
165c0 72 64 54 79 70 65 20 3d 20 65 43 6f 6f 72 64 54  rdType = eCoordT
165d0 79 70 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52  ype;.  memcpy(pR
165e0 74 72 65 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b  tree->zDb, argv[
165f0 31 5d 2c 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63  1], nDb);.  memc
16600 70 79 28 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65  py(pRtree->zName
16610 2c 20 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65  , argv[2], nName
16620 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
16630 6f 75 74 20 74 68 65 20 6e 6f 64 65 20 73 69 7a  out the node siz
16640 65 20 74 6f 20 75 73 65 2e 20 2a 2f 0a 20 20 72  e to use. */.  r
16650 63 20 3d 20 67 65 74 4e 6f 64 65 53 69 7a 65 28  c = getNodeSize(
16660 64 62 2c 20 70 52 74 72 65 65 2c 20 69 73 43 72  db, pRtree, isCr
16670 65 61 74 65 2c 20 70 7a 45 72 72 29 3b 0a 0a 20  eate, pzErr);.. 
16680 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f 6e 6e 65   /* Create/Conne
16690 63 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ct to the underl
166a0 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e 61 6c 20  ying relational 
166b0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
166c0 20 49 66 0a 20 20 2a 2a 20 74 68 61 74 20 69 73   If.  ** that is
166d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 61 6c   successful, cal
166e0 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  l sqlite3_declar
166f0 65 5f 76 74 61 62 28 29 20 74 6f 20 63 6f 6e 66  e_vtab() to conf
16700 69 67 75 72 65 0a 20 20 2a 2a 20 74 68 65 20 72  igure.  ** the r
16710 2d 74 72 65 65 20 74 61 62 6c 65 20 73 63 68 65  -tree table sche
16720 6d 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ma..  */.  if( r
16730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16740 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 72 74      if( (rc = rt
16750 72 65 65 53 71 6c 49 6e 69 74 28 70 52 74 72 65  reeSqlInit(pRtre
16760 65 2c 20 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20  e, db, argv[1], 
16770 61 72 67 76 5b 32 5d 2c 20 69 73 43 72 65 61 74  argv[2], isCreat
16780 65 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  e)) ){.      *pz
16790 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
167a0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
167b0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
167c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
167d0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
167e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
167f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 25  CREATE TABLE x(%
16800 73 22 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20  s", argv[3]);.  
16810 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a      char *zTmp;.
16820 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
16830 20 20 20 20 66 6f 72 28 69 69 3d 34 3b 20 7a 53      for(ii=4; zS
16840 71 6c 20 26 26 20 69 69 3c 61 72 67 63 3b 20 69  ql && ii<argc; i
16850 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  i++){.        zT
16860 6d 70 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  mp = zSql;.     
16870 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
16880 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2c 20 25  3_mprintf("%s, %
16890 73 22 2c 20 7a 54 6d 70 2c 20 61 72 67 76 5b 69  s", zTmp, argv[i
168a0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
168b0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b  ite3_free(zTmp);
168c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
168d0 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  f( zSql ){.     
168e0 20 20 20 7a 54 6d 70 20 3d 20 7a 53 71 6c 3b 0a     zTmp = zSql;.
168f0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
16900 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16910 25 73 29 3b 22 2c 20 7a 54 6d 70 29 3b 0a 20 20  %s);", zTmp);.  
16920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16930 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20  ee(zTmp);.      
16940 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53 71  }.      if( !zSq
16950 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
16960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16970 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16980 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
16990 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
169a0 5f 76 74 61 62 28 64 62 2c 20 7a 53 71 6c 29 29  _vtab(db, zSql))
169b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
169c0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
169d0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
169e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
169f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
16a00 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
16a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
16a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16a30 20 29 7b 0a 20 20 20 20 2a 70 70 56 74 61 62 20   ){.    *ppVtab 
16a40 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  = (sqlite3_vtab 
16a50 2a 29 70 52 74 72 65 65 3b 0a 20 20 7d 65 6c 73  *)pRtree;.  }els
16a60 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
16a70 70 70 56 74 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ppVtab==0 );.   
16a80 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65 2d   assert( pRtree-
16a90 3e 6e 42 75 73 79 3d 3d 31 20 29 3b 0a 20 20 20  >nBusy==1 );.   
16aa0 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52   rtreeRelease(pR
16ab0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
16ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16ad0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
16ae0 20 6f 66 20 61 20 73 63 61 6c 61 72 20 66 75 6e   of a scalar fun
16af0 63 74 69 6f 6e 20 74 68 61 74 20 64 65 63 6f 64  ction that decod
16b00 65 73 20 72 2d 74 72 65 65 20 6e 6f 64 65 73 20  es r-tree nodes 
16b10 74 6f 0a 2a 2a 20 68 75 6d 61 6e 20 72 65 61 64  to.** human read
16b20 61 62 6c 65 20 73 74 72 69 6e 67 73 2e 20 54 68  able strings. Th
16b30 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  is can be used f
16b40 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64  or debugging and
16b50 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a   analysis..**.**
16b60 20 54 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63   The scalar func
16b70 74 69 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20 61  tion takes two a
16b80 72 67 75 6d 65 6e 74 73 2c 20 61 20 62 6c 6f 62  rguments, a blob
16b90 20 6f 66 20 64 61 74 61 20 63 6f 6e 74 61 69 6e   of data contain
16ba0 69 6e 67 0a 2a 2a 20 61 6e 20 72 2d 74 72 65 65  ing.** an r-tree
16bb0 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 20 6e   node, and the n
16bc0 75 6d 62 65 72 20 6f 66 20 64 69 6d 65 6e 73 69  umber of dimensi
16bd0 6f 6e 73 20 74 68 65 20 72 2d 74 72 65 65 20 69  ons the r-tree i
16be0 6e 64 65 78 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ndexes..** For a
16bf0 20 74 77 6f 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c   two-dimensional
16c00 20 72 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   r-tree structur
16c10 65 20 63 61 6c 6c 65 64 20 22 72 74 22 2c 20 74  e called "rt", t
16c20 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 0a 2a 2a  o deserialize.**
16c30 20 61 6c 6c 20 6e 6f 64 65 73 2c 20 61 20 73 74   all nodes, a st
16c40 61 74 65 6d 65 6e 74 20 6c 69 6b 65 3a 0a 2a 2a  atement like:.**
16c50 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 72 74 72  .**   SELECT rtr
16c60 65 65 6e 6f 64 65 28 32 2c 20 64 61 74 61 29 20  eenode(2, data) 
16c70 46 52 4f 4d 20 72 74 5f 6e 6f 64 65 3b 0a 2a 2a  FROM rt_node;.**
16c80 0a 2a 2a 20 54 68 65 20 68 75 6d 61 6e 20 72 65  .** The human re
16c90 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20 74 61  adable string ta
16ca0 6b 65 73 20 74 68 65 20 66 6f 72 6d 20 6f 66 20  kes the form of 
16cb0 61 20 54 63 6c 20 6c 69 73 74 20 77 69 74 68 20  a Tcl list with 
16cc0 6f 6e 65 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  one.** entry for
16cd0 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68   each cell in th
16ce0 65 20 72 2d 74 72 65 65 20 6e 6f 64 65 2e 20 45  e r-tree node. E
16cf0 61 63 68 20 65 6e 74 72 79 20 69 73 20 69 74 73  ach entry is its
16d00 65 6c 66 20 61 0a 2a 2a 20 6c 69 73 74 2c 20 63  elf a.** list, c
16d10 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 38 2d  ontaining the 8-
16d20 62 79 74 65 20 72 6f 77 69 64 2f 70 61 67 65 6e  byte rowid/pagen
16d30 6f 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  o followed by th
16d40 65 20 0a 2a 2a 20 3c 6e 75 6d 2d 64 69 6d 65 6e  e .** <num-dimen
16d50 73 69 6f 6e 3e 2a 32 20 63 6f 6f 72 64 69 6e 61  sion>*2 coordina
16d60 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
16d70 6f 69 64 20 72 74 72 65 65 6e 6f 64 65 28 73 71  oid rtreenode(sq
16d80 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
16d90 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
16da0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
16db0 41 72 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54  Arg){.  char *zT
16dc0 65 78 74 20 3d 20 30 3b 0a 20 20 52 74 72 65 65  ext = 0;.  Rtree
16dd0 4e 6f 64 65 20 6e 6f 64 65 3b 0a 20 20 52 74 72  Node node;.  Rtr
16de0 65 65 20 74 72 65 65 3b 0a 20 20 69 6e 74 20 69  ee tree;.  int i
16df0 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
16e00 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
16e10 6d 65 6d 73 65 74 28 26 6e 6f 64 65 2c 20 30 2c  memset(&node, 0,
16e20 20 73 69 7a 65 6f 66 28 52 74 72 65 65 4e 6f 64   sizeof(RtreeNod
16e30 65 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  e));.  memset(&t
16e40 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52  ree, 0, sizeof(R
16e50 74 72 65 65 29 29 3b 0a 20 20 74 72 65 65 2e 6e  tree));.  tree.n
16e60 44 69 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Dim = sqlite3_va
16e70 6c 75 65 5f 69 6e 74 28 61 70 41 72 67 5b 30 5d  lue_int(apArg[0]
16e80 29 3b 0a 20 20 74 72 65 65 2e 6e 42 79 74 65 73  );.  tree.nBytes
16e90 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 38 20  PerCell = 8 + 8 
16ea0 2a 20 74 72 65 65 2e 6e 44 69 6d 3b 0a 20 20 6e  * tree.nDim;.  n
16eb0 6f 64 65 2e 7a 44 61 74 61 20 3d 20 28 75 38 20  ode.zData = (u8 
16ec0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
16ed0 62 6c 6f 62 28 61 70 41 72 67 5b 31 5d 29 3b 0a  blob(apArg[1]);.
16ee0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
16ef0 4e 43 45 4c 4c 28 26 6e 6f 64 65 29 3b 20 69 69  NCELL(&node); ii
16f00 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 43  ++){.    char zC
16f10 65 6c 6c 5b 35 31 32 5d 3b 0a 20 20 20 20 69 6e  ell[512];.    in
16f20 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  t nCell = 0;.   
16f30 20 52 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b   RtreeCell cell;
16f40 0a 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 0a 20 20  .    int jj;..  
16f50 20 20 6e 6f 64 65 47 65 74 43 65 6c 6c 28 26 74    nodeGetCell(&t
16f60 72 65 65 2c 20 26 6e 6f 64 65 2c 20 69 69 2c 20  ree, &node, ii, 
16f70 26 63 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &cell);.    sqli
16f80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 31 32  te3_snprintf(512
16f90 2d 6e 43 65 6c 6c 2c 26 7a 43 65 6c 6c 5b 6e 43  -nCell,&zCell[nC
16fa0 65 6c 6c 5d 2c 22 25 6c 6c 64 22 2c 20 63 65 6c  ell],"%lld", cel
16fb0 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 6e  l.iRowid);.    n
16fc0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 73 74 72 6c  Cell = (int)strl
16fd0 65 6e 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 66  en(zCell);.    f
16fe0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 74 72 65 65  or(jj=0; jj<tree
16ff0 2e 6e 44 69 6d 2a 32 3b 20 6a 6a 2b 2b 29 7b 0a  .nDim*2; jj++){.
17000 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52  #ifndef SQLITE_R
17010 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20  TREE_INT_ONLY.  
17020 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
17030 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c 26  intf(512-nCell,&
17040 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22 20  zCell[nCell], " 
17050 25 66 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %f",.           
17060 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 75              (dou
17070 62 6c 65 29 63 65 6c 6c 2e 61 43 6f 6f 72 64 5b  ble)cell.aCoord[
17080 6a 6a 5d 2e 66 29 3b 0a 23 65 6c 73 65 0a 20 20  jj].f);.#else.  
17090 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
170a0 69 6e 74 66 28 35 31 32 2d 6e 43 65 6c 6c 2c 26  intf(512-nCell,&
170b0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 22 20  zCell[nCell], " 
170c0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
170d0 20 20 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c              cell
170e0 2e 61 43 6f 6f 72 64 5b 6a 6a 5d 2e 69 29 3b 0a  .aCoord[jj].i);.
170f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65  #endif.      nCe
17100 6c 6c 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  ll = (int)strlen
17110 28 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a  (zCell);.    }..
17120 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
17130 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65  .      char *zTe
17140 78 74 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  xtNew = sqlite3_
17150 6d 70 72 69 6e 74 66 28 22 25 73 20 7b 25 73 7d  mprintf("%s {%s}
17160 22 2c 20 7a 54 65 78 74 2c 20 7a 43 65 6c 6c 29  ", zText, zCell)
17170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17180 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
17190 20 20 20 7a 54 65 78 74 20 3d 20 7a 54 65 78 74     zText = zText
171a0 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  New;.    }else{.
171b0 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73 71        zText = sq
171c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7b  lite3_mprintf("{
171d0 25 73 7d 22 2c 20 7a 43 65 6c 6c 29 3b 0a 20 20  %s}", zCell);.  
171e0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
171f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
17200 28 63 74 78 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  (ctx, zText, -1,
17210 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
17220 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  }..static void r
17230 74 72 65 65 64 65 70 74 68 28 73 71 6c 69 74 65  treedepth(sqlite
17240 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
17250 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
17260 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 29  3_value **apArg)
17270 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
17280 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 69 66  ETER(nArg);.  if
17290 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
172a0 74 79 70 65 28 61 70 41 72 67 5b 30 5d 29 21 3d  type(apArg[0])!=
172b0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 0a 20 20 20  SQLITE_BLOB .   
172c0 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  || sqlite3_value
172d0 5f 62 79 74 65 73 28 61 70 41 72 67 5b 30 5d 29  _bytes(apArg[0])
172e0 3c 32 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  <2.  ){.    sqli
172f0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
17300 28 63 74 78 2c 20 22 49 6e 76 61 6c 69 64 20 61  (ctx, "Invalid a
17310 72 67 75 6d 65 6e 74 20 74 6f 20 72 74 72 65 65  rgument to rtree
17320 64 65 70 74 68 28 29 22 2c 20 2d 31 29 3b 20 0a  depth()", -1); .
17330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
17340 2a 7a 42 6c 6f 62 20 3d 20 28 75 38 20 2a 29 73  *zBlob = (u8 *)s
17350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
17360 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20  b(apArg[0]);.   
17370 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
17380 69 6e 74 28 63 74 78 2c 20 72 65 61 64 49 6e 74  int(ctx, readInt
17390 31 36 28 7a 42 6c 6f 62 29 29 3b 0a 20 20 7d 0a  16(zBlob));.  }.
173a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
173b0 72 20 74 68 65 20 72 2d 74 72 65 65 20 6d 6f 64  r the r-tree mod
173c0 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73  ule with databas
173d0 65 20 68 61 6e 64 6c 65 20 64 62 2e 20 54 68 69  e handle db. Thi
173e0 73 20 63 72 65 61 74 65 73 20 74 68 65 0a 2a 2a  s creates the.**
173f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
17400 6f 64 75 6c 65 20 22 72 74 72 65 65 22 20 61 6e  odule "rtree" an
17410 64 20 74 68 65 20 64 65 62 75 67 67 69 6e 67 2f  d the debugging/
17420 61 6e 61 6c 79 73 69 73 20 73 63 61 6c 61 72 20  analysis scalar 
17430 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 22 72 74  .** function "rt
17440 72 65 65 6e 6f 64 65 22 2e 0a 2a 2f 0a 69 6e 74  reenode"..*/.int
17450 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
17460 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
17470 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 74 66 38    const int utf8
17480 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
17490 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
174a0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
174b0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72  _function(db, "r
174c0 74 72 65 65 6e 6f 64 65 22 2c 20 32 2c 20 75 74  treenode", 2, ut
174d0 66 38 2c 20 30 2c 20 72 74 72 65 65 6e 6f 64 65  f8, 0, rtreenode
174e0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
174f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17510 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
17520 28 64 62 2c 20 22 72 74 72 65 65 64 65 70 74 68  (db, "rtreedepth
17530 22 2c 20 31 2c 20 75 74 66 38 2c 20 30 2c 72 74  ", 1, utf8, 0,rt
17540 72 65 65 64 65 70 74 68 2c 20 30 2c 20 30 29 3b  reedepth, 0, 0);
17550 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
17560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64  QLITE_OK ){.#ifd
17570 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45 45 5f  ef SQLITE_RTREE_
17580 49 4e 54 5f 4f 4e 4c 59 0a 20 20 20 20 76 6f 69  INT_ONLY.    voi
17590 64 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52  d *c = (void *)R
175a0 54 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32  TREE_COORD_INT32
175b0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 76 6f 69 64  ;.#else.    void
175c0 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54   *c = (void *)RT
175d0 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
175e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  ;.#endif.    rc 
175f0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
17600 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22  _module_v2(db, "
17610 72 74 72 65 65 22 2c 20 26 72 74 72 65 65 4d 6f  rtree", &rtreeMo
17620 64 75 6c 65 2c 20 63 2c 20 30 29 3b 0a 20 20 7d  dule, c, 0);.  }
17630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f 69 64  E_OK ){.    void
17650 20 2a 63 20 3d 20 28 76 6f 69 64 20 2a 29 52 54   *c = (void *)RT
17660 52 45 45 5f 43 4f 4f 52 44 5f 49 4e 54 33 32 3b  REE_COORD_INT32;
17670 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17680 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f  3_create_module_
17690 76 32 28 64 62 2c 20 22 72 74 72 65 65 5f 69 33  v2(db, "rtree_i3
176a0 32 22 2c 20 26 72 74 72 65 65 4d 6f 64 75 6c 65  2", &rtreeModule
176b0 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , c, 0);.  }..  
176c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
176d0 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66  .** A version of
176e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
176f0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
17700 20 61 73 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20   as a callback. 
17710 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
17720 69 6e 20 74 77 6f 20 70 6c 61 63 65 73 20 2d 20  in two places - 
17730 61 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  as the destructo
17740 72 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 76  r for the blob v
17750 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
17760 20 74 68 65 0a 2a 2a 20 69 6e 76 6f 63 61 74 69   the.** invocati
17770 6f 6e 20 6f 66 20 61 20 67 65 6f 6d 65 74 72 79  on of a geometry
17780 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 61   function, and a
17790 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  s the destructor
177a0 20 66 6f 72 20 74 68 65 20 67 65 6f 6d 65 74 72   for the geometr
177b0 79 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74  y.** functions t
177c0 68 65 6d 73 65 6c 76 65 73 2e 0a 2a 2f 0a 73 74  hemselves..*/.st
177d0 61 74 69 63 20 76 6f 69 64 20 64 6f 53 71 6c 69  atic void doSqli
177e0 74 65 33 46 72 65 65 28 76 6f 69 64 20 2a 70 29  te3Free(void *p)
177f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
17800 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61  (p);.}../*.** Ea
17810 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
17820 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
17830 79 5f 63 61 6c 6c 62 61 63 6b 28 29 20 63 72 65  y_callback() cre
17840 61 74 65 73 20 61 6e 20 6f 72 64 69 6e 61 72 79  ates an ordinary
17850 20 53 51 4c 69 74 65 0a 2a 2a 20 73 63 61 6c 61   SQLite.** scala
17860 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  r user function.
17870 20 54 68 69 73 20 43 20 66 75 6e 63 74 69 6f 6e   This C function
17880 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
17890 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 73 75   used for all su
178a0 63 68 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ch.** registered
178b0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
178c0 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61 72  **.** The scalar
178d0 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20   user functions 
178e0 72 65 74 75 72 6e 20 61 20 62 6c 6f 62 20 74 68  return a blob th
178f0 61 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  at is interprete
17900 64 20 62 79 20 72 2d 74 72 65 65 0a 2a 2a 20 74  d by r-tree.** t
17910 61 62 6c 65 20 4d 41 54 43 48 20 6f 70 65 72 61  able MATCH opera
17920 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
17930 76 6f 69 64 20 67 65 6f 6d 43 61 6c 6c 62 61 63  void geomCallbac
17940 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  k(sqlite3_contex
17950 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
17960 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
17970 2a 2a 61 41 72 67 29 7b 0a 20 20 52 74 72 65 65  **aArg){.  Rtree
17980 47 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47  GeomCallback *pG
17990 65 6f 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47  eomCtx = (RtreeG
179a0 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71  eomCallback *)sq
179b0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
179c0 63 74 78 29 3b 0a 20 20 52 74 72 65 65 4d 61 74  ctx);.  RtreeMat
179d0 63 68 41 72 67 20 2a 70 42 6c 6f 62 3b 0a 20 20  chArg *pBlob;.  
179e0 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a 20 20 6e 42  int nBlob;..  nB
179f0 6c 6f 62 20 3d 20 73 69 7a 65 6f 66 28 52 74 72  lob = sizeof(Rtr
17a00 65 65 4d 61 74 63 68 41 72 67 29 20 2b 20 28 6e  eeMatchArg) + (n
17a10 41 72 67 2d 31 29 2a 73 69 7a 65 6f 66 28 52 74  Arg-1)*sizeof(Rt
17a20 72 65 65 44 56 61 6c 75 65 29 3b 0a 20 20 70 42  reeDValue);.  pB
17a30 6c 6f 62 20 3d 20 28 52 74 72 65 65 4d 61 74 63  lob = (RtreeMatc
17a40 68 41 72 67 20 2a 29 73 71 6c 69 74 65 33 5f 6d  hArg *)sqlite3_m
17a50 61 6c 6c 6f 63 28 6e 42 6c 6f 62 29 3b 0a 20 20  alloc(nBlob);.  
17a60 69 66 28 20 21 70 42 6c 6f 62 20 29 7b 0a 20 20  if( !pBlob ){.  
17a70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
17a80 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78  _error_nomem(ctx
17a90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17aa0 69 6e 74 20 69 3b 0a 20 20 20 20 70 42 6c 6f 62  int i;.    pBlob
17ab0 2d 3e 6d 61 67 69 63 20 3d 20 52 54 52 45 45 5f  ->magic = RTREE_
17ac0 47 45 4f 4d 45 54 52 59 5f 4d 41 47 49 43 3b 0a  GEOMETRY_MAGIC;.
17ad0 20 20 20 20 70 42 6c 6f 62 2d 3e 78 47 65 6f 6d      pBlob->xGeom
17ae0 20 3d 20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65   = pGeomCtx->xGe
17af0 6f 6d 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 70  om;.    pBlob->p
17b00 43 6f 6e 74 65 78 74 20 3d 20 70 47 65 6f 6d 43  Context = pGeomC
17b10 74 78 2d 3e 70 43 6f 6e 74 65 78 74 3b 0a 20 20  tx->pContext;.  
17b20 20 20 70 42 6c 6f 62 2d 3e 6e 50 61 72 61 6d 20    pBlob->nParam 
17b30 3d 20 6e 41 72 67 3b 0a 20 20 20 20 66 6f 72 28  = nArg;.    for(
17b40 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
17b50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17b60 5f 52 54 52 45 45 5f 49 4e 54 5f 4f 4e 4c 59 0a  _RTREE_INT_ONLY.
17b70 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61        pBlob->aPa
17b80 72 61 6d 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  ram[i] = sqlite3
17b90 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 41 72  _value_int64(aAr
17ba0 67 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 20 20 20  g[i]);.#else.   
17bb0 20 20 20 70 42 6c 6f 62 2d 3e 61 50 61 72 61 6d     pBlob->aParam
17bc0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  [i] = sqlite3_va
17bd0 6c 75 65 5f 64 6f 75 62 6c 65 28 61 41 72 67 5b  lue_double(aArg[
17be0 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  i]);.#endif.    
17bf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
17c00 73 75 6c 74 5f 62 6c 6f 62 28 63 74 78 2c 20 70  sult_blob(ctx, p
17c10 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 64 6f 53  Blob, nBlob, doS
17c20 71 6c 69 74 65 33 46 72 65 65 29 3b 0a 20 20 7d  qlite3Free);.  }
17c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
17c40 65 72 20 61 20 6e 65 77 20 67 65 6f 6d 65 74 72  er a new geometr
17c50 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 75  y function for u
17c60 73 65 20 77 69 74 68 20 74 68 65 20 72 2d 74 72  se with the r-tr
17c70 65 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  ee MATCH operato
17c80 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
17c90 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72 79  3_rtree_geometry
17ca0 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71 6c  _callback(.  sql
17cb0 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
17cc0 74 20 63 68 61 72 20 2a 7a 47 65 6f 6d 2c 0a 20  t char *zGeom,. 
17cd0 20 69 6e 74 20 28 2a 78 47 65 6f 6d 29 28 73 71   int (*xGeom)(sq
17ce0 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
17cf0 65 74 72 79 20 2a 2c 20 69 6e 74 2c 20 52 74 72  etry *, int, Rtr
17d00 65 65 44 56 61 6c 75 65 20 2a 2c 20 69 6e 74 20  eeDValue *, int 
17d10 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  *),.  void *pCon
17d20 74 65 78 74 0a 29 7b 0a 20 20 52 74 72 65 65 47  text.){.  RtreeG
17d30 65 6f 6d 43 61 6c 6c 62 61 63 6b 20 2a 70 47 65  eomCallback *pGe
17d40 6f 6d 43 74 78 3b 20 20 20 20 20 20 2f 2a 20 43  omCtx;      /* C
17d50 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
17d60 72 20 6e 65 77 20 75 73 65 72 2d 66 75 6e 63 74  r new user-funct
17d70 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ion */..  /* All
17d80 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
17d90 74 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  te the context o
17da0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 47 65 6f  bject. */.  pGeo
17db0 6d 43 74 78 20 3d 20 28 52 74 72 65 65 47 65 6f  mCtx = (RtreeGeo
17dc0 6d 43 61 6c 6c 62 61 63 6b 20 2a 29 73 71 6c 69  mCallback *)sqli
17dd0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
17de0 66 28 52 74 72 65 65 47 65 6f 6d 43 61 6c 6c 62  f(RtreeGeomCallb
17df0 61 63 6b 29 29 3b 0a 20 20 69 66 28 20 21 70 47  ack));.  if( !pG
17e00 65 6f 6d 43 74 78 20 29 20 72 65 74 75 72 6e 20  eomCtx ) return 
17e10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17e20 70 47 65 6f 6d 43 74 78 2d 3e 78 47 65 6f 6d 20  pGeomCtx->xGeom 
17e30 3d 20 78 47 65 6f 6d 3b 0a 20 20 70 47 65 6f 6d  = xGeom;.  pGeom
17e40 43 74 78 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20  Ctx->pContext = 
17e50 70 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  pContext;..  /* 
17e60 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 75  Create the new u
17e70 73 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 52 65  ser-function. Re
17e80 67 69 73 74 65 72 20 61 20 64 65 73 74 72 75 63  gister a destruc
17e90 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  tor function to 
17ea0 64 65 6c 65 74 65 0a 20 20 2a 2a 20 74 68 65 20  delete.  ** the 
17eb0 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 77  context object w
17ec0 68 65 6e 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e  hen it is no lon
17ed0 67 65 72 20 72 65 71 75 69 72 65 64 2e 20 20 2a  ger required.  *
17ee0 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
17ef0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
17f00 6f 6e 5f 76 32 28 64 62 2c 20 7a 47 65 6f 6d 2c  on_v2(db, zGeom,
17f10 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c   -1, SQLITE_ANY,
17f20 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29   .      (void *)
17f30 70 47 65 6f 6d 43 74 78 2c 20 67 65 6f 6d 43 61  pGeomCtx, geomCa
17f40 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 64 6f  llback, 0, 0, do
17f50 53 71 6c 69 74 65 33 46 72 65 65 0a 20 20 29 3b  Sqlite3Free.  );
17f60 0a 7d 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .}..#if !SQLITE_
17f70 43 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49 4e  CORE.#ifdef _WIN
17f80 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
17f90 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
17fa0 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 74 72 65  int sqlite3_rtre
17fb0 65 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  e_init(.  sqlite
17fc0 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a  3 *db,.  char **
17fd0 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrMsg,.  cons
17fe0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
17ff0 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
18000 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
18010 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 0a 20  ON_INIT2(pApi). 
18020 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
18030 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 7d 0a  treeInit(db);.}.
18040 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a     #endif..#endif.