/ Hex Artifact Content
Login

Artifact 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 20 41 75 67 75 73  /*.** 2010 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ***.** Code for 
0180: 74 65 73 74 69 6e 67 20 61 6c 6c 20 73 6f 72 74  testing all sort
0190: 73 20 6f 66 20 53 51 4c 69 74 65 20 69 6e 74 65  s of SQLite inte
01a0: 72 66 61 63 65 73 2e 20 54 68 69 73 20 63 6f 64  rfaces. This cod
01b0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 63 6c  e.** is not incl
01c0: 75 64 65 64 20 69 6e 20 74 68 65 20 53 51 4c 69  uded in the SQLi
01d0: 74 65 20 6c 69 62 72 61 72 79 2e 20 0a 2a 2f 0a  te library. .*/.
01e0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
01f0: 65 33 2e 68 22 0a 23 69 66 20 64 65 66 69 6e 65  e3.h".#if define
0200: 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54 45  d(INCLUDE_SQLITE
0210: 5f 54 43 4c 5f 48 29 0a 23 20 20 69 6e 63 6c 75  _TCL_H).#  inclu
0220: 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68  de "sqlite_tcl.h
0230: 22 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75  ".#else.#  inclu
0240: 64 65 20 22 74 63 6c 2e 68 22 0a 23 65 6e 64 69  de "tcl.h".#endi
0250: 66 0a 0a 2f 2a 20 53 6f 6c 65 6c 79 20 66 6f 72  f../* Solely for
0260: 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
0270: 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 2e 20 2a  METER() macro. *
0280: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0290: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
02a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
02b0: 54 52 45 45 0a 2f 2a 20 0a 2a 2a 20 54 79 70 65  TREE./* .** Type
02c0: 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 70   used to cache p
02d0: 61 72 61 6d 65 74 65 72 20 69 6e 66 6f 72 6d 61  arameter informa
02e0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22 63 69  tion for the "ci
02f0: 72 63 6c 65 22 20 72 2d 74 72 65 65 20 67 65 6f  rcle" r-tree geo
0300: 6d 65 74 72 79 0a 2a 2a 20 63 61 6c 6c 62 61 63  metry.** callbac
0310: 6b 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  k..*/.typedef st
0320: 72 75 63 74 20 43 69 72 63 6c 65 20 43 69 72 63  ruct Circle Circ
0330: 6c 65 3b 0a 73 74 72 75 63 74 20 43 69 72 63 6c  le;.struct Circl
0340: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 42 6f 78  e {.  struct Box
0350: 20 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 6d   {.    double xm
0360: 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78  in;.    double x
0370: 6d 61 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  max;.    double 
0380: 79 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65  ymin;.    double
0390: 20 79 6d 61 78 3b 0a 20 20 7d 20 61 42 6f 78 5b   ymax;.  } aBox[
03a0: 32 5d 3b 0a 20 20 64 6f 75 62 6c 65 20 63 65 6e  2];.  double cen
03b0: 74 65 72 78 3b 0a 20 20 64 6f 75 62 6c 65 20 63  terx;.  double c
03c0: 65 6e 74 65 72 79 3b 0a 20 20 64 6f 75 62 6c 65  entery;.  double
03d0: 20 72 61 64 69 75 73 3b 0a 20 20 64 6f 75 62 6c   radius;.  doubl
03e0: 65 20 6d 78 41 72 65 61 3b 0a 20 20 69 6e 74 20  e mxArea;.  int 
03f0: 65 53 63 6f 72 65 54 79 70 65 3b 0a 7d 3b 0a 0a  eScoreType;.};..
0400: 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72  /*.** Destructor
0410: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 43 69   function for Ci
0420: 72 63 6c 65 20 6f 62 6a 65 63 74 73 20 61 6c 6c  rcle objects all
0430: 6f 63 61 74 65 64 20 62 79 20 63 69 72 63 6c 65  ocated by circle
0440: 5f 67 65 6f 6d 28 29 2e 0a 2a 2f 0a 73 74 61 74  _geom()..*/.stat
0450: 69 63 20 76 6f 69 64 20 63 69 72 63 6c 65 5f 64  ic void circle_d
0460: 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73  el(void *p){.  s
0470: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
0480: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0490: 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63 69 72 63  ntation of "circ
04a0: 6c 65 22 20 72 2d 74 72 65 65 20 67 65 6f 6d 65  le" r-tree geome
04b0: 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  try callback..*/
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69 72 63  .static int circ
04d0: 6c 65 5f 67 65 6f 6d 28 0a 20 20 73 71 6c 69 74  le_geom(.  sqlit
04e0: 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65 74 72  e3_rtree_geometr
04f0: 79 20 2a 70 2c 0a 20 20 69 6e 74 20 6e 43 6f 6f  y *p,.  int nCoo
0500: 72 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 72  rd, .  sqlite3_r
0510: 74 72 65 65 5f 64 62 6c 20 2a 61 43 6f 6f 72 64  tree_dbl *aCoord
0520: 2c 0a 20 20 69 6e 74 20 2a 70 52 65 73 0a 29 7b  ,.  int *pRes.){
0530: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0550: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
0560: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 43 69 72  ariable */.  Cir
0570: 63 6c 65 20 2a 70 43 69 72 63 6c 65 3b 20 20 20  cle *pCircle;   
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0590: 53 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69  Structure defini
05a0: 6e 67 20 63 69 72 63 75 6c 61 72 20 72 65 67 69  ng circular regi
05b0: 6f 6e 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 78  on */.  double x
05c0: 6d 69 6e 2c 20 78 6d 61 78 3b 20 20 20 20 20 20  min, xmax;      
05d0: 20 20 20 20 20 20 20 20 2f 2a 20 58 20 64 69 6d          /* X dim
05e0: 65 6e 73 69 6f 6e 73 20 6f 66 20 62 6f 78 20 62  ensions of box b
05f0: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
0600: 20 64 6f 75 62 6c 65 20 79 6d 69 6e 2c 20 79 6d   double ymin, ym
0610: 61 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ax;             
0620: 20 2f 2a 20 58 20 64 69 6d 65 6e 73 69 6f 6e 73   /* X dimensions
0630: 20 6f 66 20 62 6f 78 20 62 65 69 6e 67 20 74 65   of box being te
0640: 73 74 65 64 20 2a 2f 0a 0a 20 20 78 6d 69 6e 20  sted */..  xmin 
0650: 3d 20 61 43 6f 6f 72 64 5b 30 5d 3b 0a 20 20 78  = aCoord[0];.  x
0660: 6d 61 78 20 3d 20 61 43 6f 6f 72 64 5b 31 5d 3b  max = aCoord[1];
0670: 0a 20 20 79 6d 69 6e 20 3d 20 61 43 6f 6f 72 64  .  ymin = aCoord
0680: 5b 32 5d 3b 0a 20 20 79 6d 61 78 20 3d 20 61 43  [2];.  ymax = aC
0690: 6f 6f 72 64 5b 33 5d 3b 0a 20 20 70 43 69 72 63  oord[3];.  pCirc
06a0: 6c 65 20 3d 20 28 43 69 72 63 6c 65 20 2a 29 70  le = (Circle *)p
06b0: 2d 3e 70 55 73 65 72 3b 0a 20 20 69 66 28 20 70  ->pUser;.  if( p
06c0: 43 69 72 63 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Circle==0 ){.   
06d0: 20 2f 2a 20 49 66 20 70 55 73 65 72 20 69 73 20   /* If pUser is 
06e0: 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68  still 0, then th
06f0: 65 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75  e parameter valu
0700: 65 73 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  es have not been
0710: 20 74 65 73 74 65 64 0a 20 20 20 20 2a 2a 20 66   tested.    ** f
0720: 6f 72 20 63 6f 72 72 65 63 74 6e 65 73 73 20 6f  or correctness o
0730: 72 20 73 74 6f 72 65 64 20 69 6e 74 6f 20 61 20  r stored into a 
0740: 43 69 72 63 6c 65 20 73 74 72 75 63 74 75 72 65  Circle structure
0750: 20 79 65 74 2e 20 44 6f 20 74 68 69 73 20 6e 6f   yet. Do this no
0760: 77 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  w. */..    /* Th
0770: 69 73 20 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c  is geometry call
0780: 62 61 63 6b 20 69 73 20 66 6f 72 20 75 73 65 20  back is for use 
0790: 77 69 74 68 20 61 20 32 2d 64 69 6d 65 6e 73 69  with a 2-dimensi
07a0: 6f 6e 61 6c 20 72 2d 74 72 65 65 20 74 61 62 6c  onal r-tree tabl
07b0: 65 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  e..    ** Return
07c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
07d0: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
07e0: 68 61 76 65 20 65 78 61 63 74 6c 79 20 32 20 64  have exactly 2 d
07f0: 69 6d 65 6e 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  imensions. */.  
0800: 20 20 69 66 28 20 6e 43 6f 6f 72 64 21 3d 34 20    if( nCoord!=4 
0810: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
0820: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 2f 2a 20 54  ERROR;..    /* T
0830: 65 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 72  est that the cor
0840: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rect number of p
0850: 61 72 61 6d 65 74 65 72 73 20 28 33 29 20 68 61  arameters (3) ha
0860: 76 65 20 62 65 65 6e 20 73 75 70 70 6c 69 65 64  ve been supplied
0870: 2c 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 61  ,.    ** and tha
0880: 74 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  t the parameters
0890: 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20 28 74   are in range (t
08a0: 68 61 74 20 74 68 65 20 72 61 64 69 75 73 20 6f  hat the radius o
08b0: 66 20 74 68 65 20 63 69 72 63 6c 65 20 0a 20 20  f the circle .  
08c0: 20 20 2a 2a 20 72 61 64 69 75 73 20 69 73 20 67    ** radius is g
08d0: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
08e0: 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  ). */.    if( p-
08f0: 3e 6e 50 61 72 61 6d 21 3d 33 20 7c 7c 20 70 2d  >nParam!=3 || p-
0900: 3e 61 50 61 72 61 6d 5b 32 5d 3c 30 2e 30 20 29  >aParam[2]<0.0 )
0910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
0920: 52 52 4f 52 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  RROR;..    /* Al
0930: 6c 6f 63 61 74 65 20 61 20 73 74 72 75 63 74 75  locate a structu
0940: 72 65 20 74 6f 20 63 61 63 68 65 20 70 61 72 61  re to cache para
0950: 6d 65 74 65 72 20 64 61 74 61 20 69 6e 2e 20 52  meter data in. R
0960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
0970: 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  EM.    ** if the
0980: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
0990: 73 2e 20 2a 2f 0a 20 20 20 20 70 43 69 72 63 6c  s. */.    pCircl
09a0: 65 20 3d 20 28 43 69 72 63 6c 65 20 2a 29 28 70  e = (Circle *)(p
09b0: 2d 3e 70 55 73 65 72 20 3d 20 73 71 6c 69 74 65  ->pUser = sqlite
09c0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
09d0: 43 69 72 63 6c 65 29 29 29 3b 0a 20 20 20 20 69  Circle)));.    i
09e0: 66 28 20 21 70 43 69 72 63 6c 65 20 29 20 72 65  f( !pCircle ) re
09f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
0a00: 4d 3b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 55 73  M;.    p->xDelUs
0a10: 65 72 20 3d 20 63 69 72 63 6c 65 5f 64 65 6c 3b  er = circle_del;
0a20: 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
0a30: 74 68 65 20 63 65 6e 74 65 72 20 61 6e 64 20 72  the center and r
0a40: 61 64 69 75 73 20 6f 66 20 74 68 65 20 63 69 72  adius of the cir
0a50: 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20 4f 6e  cular region. On
0a60: 65 20 77 61 79 20 74 68 61 74 0a 20 20 20 20 2a  e way that.    *
0a70: 2a 20 74 65 73 74 65 64 20 62 6f 75 6e 64 69 6e  * tested boundin
0a80: 67 20 62 6f 78 65 73 20 74 68 61 74 20 69 6e 74  g boxes that int
0a90: 65 72 73 65 63 74 20 74 68 65 20 63 69 72 63 75  ersect the circu
0aa0: 6c 61 72 20 72 65 67 69 6f 6e 20 61 72 65 20 64  lar region are d
0ab0: 65 74 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 69  etected.    ** i
0ac0: 73 20 62 79 20 74 65 73 74 69 6e 67 20 69 66 20  s by testing if 
0ad0: 65 61 63 68 20 63 6f 72 6e 65 72 20 6f 66 20 74  each corner of t
0ae0: 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20  he bounding box 
0af0: 6c 69 65 73 20 77 69 74 68 69 6e 20 72 61 64 69  lies within radi
0b00: 75 73 0a 20 20 20 20 2a 2a 20 75 6e 69 74 73 20  us.    ** units 
0b10: 6f 66 20 74 68 65 20 63 65 6e 74 65 72 20 6f 66  of the center of
0b20: 20 74 68 65 20 63 69 72 63 6c 65 2e 20 2a 2f 0a   the circle. */.
0b30: 20 20 20 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e      pCircle->cen
0b40: 74 65 72 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d  terx = p->aParam
0b50: 5b 30 5d 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  [0];.    pCircle
0b60: 2d 3e 63 65 6e 74 65 72 79 20 3d 20 70 2d 3e 61  ->centery = p->a
0b70: 50 61 72 61 6d 5b 31 5d 3b 0a 20 20 20 20 70 43  Param[1];.    pC
0b80: 69 72 63 6c 65 2d 3e 72 61 64 69 75 73 20 3d 20  ircle->radius = 
0b90: 70 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 0a 20  p->aParam[2];.. 
0ba0: 20 20 20 2f 2a 20 44 65 66 69 6e 65 20 74 77 6f     /* Define two
0bb0: 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 72 65   bounding box re
0bc0: 67 69 6f 6e 73 2e 20 54 68 65 20 66 69 72 73 74  gions. The first
0bd0: 2c 20 61 42 6f 78 5b 30 5d 2c 20 65 78 74 65 6e  , aBox[0], exten
0be0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 66  ds to.    ** inf
0bf0: 69 6e 69 74 79 20 69 6e 20 74 68 65 20 58 20 64  inity in the X d
0c00: 69 6d 65 6e 73 69 6f 6e 2e 20 49 74 20 63 6f 76  imension. It cov
0c10: 65 72 73 20 74 68 65 20 73 61 6d 65 20 72 61 6e  ers the same ran
0c20: 67 65 20 6f 66 20 74 68 65 20 59 20 64 69 6d 65  ge of the Y dime
0c30: 6e 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 61 73 20  nsion.    ** as 
0c40: 74 68 65 20 63 69 72 63 75 6c 61 72 20 72 65 67  the circular reg
0c50: 69 6f 6e 2e 20 54 68 65 20 73 65 63 6f 6e 64 2c  ion. The second,
0c60: 20 61 42 6f 78 5b 31 5d 2c 20 65 78 74 65 6e 64   aBox[1], extend
0c70: 73 20 74 6f 20 69 6e 66 69 6e 69 74 79 20 69 6e  s to infinity in
0c80: 0a 20 20 20 20 2a 2a 20 74 68 65 20 59 20 64 69  .    ** the Y di
0c90: 6d 65 6e 73 69 6f 6e 20 61 6e 64 20 69 73 20 63  mension and is c
0ca0: 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 74 68  onstrained to th
0cb0: 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 63  e range of the c
0cc0: 69 72 63 6c 65 20 69 6e 20 74 68 65 0a 20 20 20  ircle in the.   
0cd0: 20 2a 2a 20 58 20 64 69 6d 65 6e 73 69 6f 6e 2e   ** X dimension.
0ce0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
0cf0: 68 65 6e 20 69 6d 61 67 69 6e 65 20 65 61 63 68  hen imagine each
0d00: 20 62 6f 78 20 69 73 20 73 70 6c 69 74 20 69 6e   box is split in
0d10: 20 68 61 6c 66 20 61 6c 6f 6e 67 20 69 74 73 20   half along its 
0d20: 73 68 6f 72 74 20 61 78 69 73 20 62 79 20 61 20  short axis by a 
0d30: 6c 69 6e 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  line.    ** that
0d40: 20 69 6e 74 65 72 73 65 63 74 73 20 74 68 65 20   intersects the 
0d50: 63 65 6e 74 65 72 20 6f 66 20 74 68 65 20 63 69  center of the ci
0d60: 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20 41  rcular region. A
0d70: 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 20 20   bounding box.  
0d80: 20 20 2a 2a 20 62 65 69 6e 67 20 74 65 73 74 65    ** being teste
0d90: 64 20 63 61 6e 20 62 65 20 73 61 69 64 20 74 6f  d can be said to
0da0: 20 69 6e 74 65 72 73 65 63 74 20 74 68 65 20 63   intersect the c
0db0: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 69  ircular region i
0dc0: 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  f it contains.  
0dd0: 20 20 2a 2a 20 70 6f 69 6e 74 73 20 66 72 6f 6d    ** points from
0de0: 20 65 61 63 68 20 68 61 6c 66 20 6f 66 20 65 69   each half of ei
0df0: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
0e00: 69 6e 66 69 6e 69 74 65 20 62 6f 75 6e 64 69 6e  infinite boundin
0e10: 67 20 62 6f 78 65 73 2e 0a 20 20 20 20 2a 2f 0a  g boxes..    */.
0e20: 20 20 20 20 70 43 69 72 63 6c 65 2d 3e 61 42 6f      pCircle->aBo
0e30: 78 5b 30 5d 2e 78 6d 69 6e 20 3d 20 70 43 69 72  x[0].xmin = pCir
0e40: 63 6c 65 2d 3e 63 65 6e 74 65 72 78 3b 0a 20 20  cle->centerx;.  
0e50: 20 20 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b    pCircle->aBox[
0e60: 30 5d 2e 78 6d 61 78 20 3d 20 70 43 69 72 63 6c  0].xmax = pCircl
0e70: 65 2d 3e 63 65 6e 74 65 72 78 3b 0a 20 20 20 20  e->centerx;.    
0e80: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d  pCircle->aBox[0]
0e90: 2e 79 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d  .ymin = pCircle-
0ea0: 3e 63 65 6e 74 65 72 79 20 2b 20 70 43 69 72 63  >centery + pCirc
0eb0: 6c 65 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20  le->radius;.    
0ec0: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d  pCircle->aBox[0]
0ed0: 2e 79 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d  .ymax = pCircle-
0ee0: 3e 63 65 6e 74 65 72 79 20 2d 20 70 43 69 72 63  >centery - pCirc
0ef0: 6c 65 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20  le->radius;.    
0f00: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d  pCircle->aBox[1]
0f10: 2e 78 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d  .xmin = pCircle-
0f20: 3e 63 65 6e 74 65 72 78 20 2b 20 70 43 69 72 63  >centerx + pCirc
0f30: 6c 65 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20  le->radius;.    
0f40: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d  pCircle->aBox[1]
0f50: 2e 78 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d  .xmax = pCircle-
0f60: 3e 63 65 6e 74 65 72 78 20 2d 20 70 43 69 72 63  >centerx - pCirc
0f70: 6c 65 2d 3e 72 61 64 69 75 73 3b 0a 20 20 20 20  le->radius;.    
0f80: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d  pCircle->aBox[1]
0f90: 2e 79 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d  .ymin = pCircle-
0fa0: 3e 63 65 6e 74 65 72 79 3b 0a 20 20 20 20 70 43  >centery;.    pC
0fb0: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79  ircle->aBox[1].y
0fc0: 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  max = pCircle->c
0fd0: 65 6e 74 65 72 79 3b 0a 20 20 20 20 70 43 69 72  entery;.    pCir
0fe0: 63 6c 65 2d 3e 6d 78 41 72 65 61 20 3d 20 28 78  cle->mxArea = (x
0ff0: 6d 61 78 20 2d 20 78 6d 69 6e 29 2a 28 79 6d 61  max - xmin)*(yma
1000: 78 20 2d 20 79 6d 69 6e 29 20 2b 20 31 2e 30 3b  x - ymin) + 1.0;
1010: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
1020: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 34   if any of the 4
1030: 20 63 6f 72 6e 65 72 73 20 6f 66 20 74 68 65 20   corners of the 
1040: 62 6f 75 6e 64 69 6e 67 2d 62 6f 78 20 62 65 69  bounding-box bei
1050: 6e 67 20 74 65 73 74 65 64 20 6c 69 65 20 0a 20  ng tested lie . 
1060: 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 63   ** inside the c
1070: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20  ircular region. 
1080: 49 66 20 74 68 65 79 20 64 6f 2c 20 74 68 65 6e  If they do, then
1090: 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 2d 62 6f   the bounding-bo
10a0: 78 20 64 6f 65 73 0a 20 20 2a 2a 20 69 6e 74 65  x does.  ** inte
10b0: 72 73 65 63 74 20 74 68 65 20 72 65 67 69 6f 6e  rsect the region
10c0: 20 6f 66 20 69 6e 74 65 72 65 73 74 2e 20 53 65   of interest. Se
10d0: 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
10e0: 69 61 62 6c 65 20 74 6f 20 74 72 75 65 20 61 6e  iable to true an
10f0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
1100: 4c 49 54 45 5f 4f 4b 20 69 6e 20 74 68 69 73 20  LITE_OK in this 
1110: 63 61 73 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  case. */.  for(i
1120: 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =0; i<4; i++){. 
1130: 20 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 28 69     double x = (i
1140: 26 30 78 30 31 29 20 3f 20 78 6d 61 78 20 3a 20  &0x01) ? xmax : 
1150: 78 6d 69 6e 3b 0a 20 20 20 20 64 6f 75 62 6c 65  xmin;.    double
1160: 20 79 20 3d 20 28 69 26 30 78 30 32 29 20 3f 20   y = (i&0x02) ? 
1170: 79 6d 61 78 20 3a 20 79 6d 69 6e 3b 0a 20 20 20  ymax : ymin;.   
1180: 20 64 6f 75 62 6c 65 20 64 32 3b 0a 20 20 20 20   double d2;.    
1190: 0a 20 20 20 20 64 32 20 20 3d 20 28 78 2d 70 43  .    d2  = (x-pC
11a0: 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 78 29 2a  ircle->centerx)*
11b0: 28 78 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74  (x-pCircle->cent
11c0: 65 72 78 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20  erx);.    d2 += 
11d0: 28 79 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74  (y-pCircle->cent
11e0: 65 72 79 29 2a 28 79 2d 70 43 69 72 63 6c 65 2d  ery)*(y-pCircle-
11f0: 3e 63 65 6e 74 65 72 79 29 3b 0a 20 20 20 20 69  >centery);.    i
1200: 66 28 20 64 32 3c 28 70 43 69 72 63 6c 65 2d 3e  f( d2<(pCircle->
1210: 72 61 64 69 75 73 2a 70 43 69 72 63 6c 65 2d 3e  radius*pCircle->
1220: 72 61 64 69 75 73 29 20 29 7b 0a 20 20 20 20 20  radius) ){.     
1230: 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1250: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1260: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
1270: 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 20 63 6f   bounding box co
1280: 76 65 72 73 20 61 6e 79 20 6f 74 68 65 72 20 70  vers any other p
1290: 61 72 74 20 6f 66 20 74 68 65 20 63 69 72 63 75  art of the circu
12a0: 6c 61 72 20 72 65 67 69 6f 6e 2e 0a 20 20 2a 2a  lar region..  **
12b0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
12c0: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
12d0: 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 68 69  ption of how thi
12e0: 73 20 74 65 73 74 20 77 6f 72 6b 73 2e 20 49 66  s test works. If
12f0: 20 69 74 20 64 6f 65 73 0a 20 20 2a 2a 20 63 6f   it does.  ** co
1300: 76 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  ver part of the 
1310: 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2c  circular region,
1320: 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
1330: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65  variable to true
1340: 0a 20 20 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  .  ** and return
1350: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20   SQLITE_OK. */. 
1360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
1370: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 78 6d 69  ++){.    if( xmi
1380: 6e 3c 3d 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78  n<=pCircle->aBox
1390: 5b 69 5d 2e 78 6d 69 6e 20 0a 20 20 20 20 20 26  [i].xmin .     &
13a0: 26 20 78 6d 61 78 3e 3d 70 43 69 72 63 6c 65 2d  & xmax>=pCircle-
13b0: 3e 61 42 6f 78 5b 69 5d 2e 78 6d 61 78 20 0a 20  >aBox[i].xmax . 
13c0: 20 20 20 20 26 26 20 79 6d 69 6e 3c 3d 70 43 69      && ymin<=pCi
13d0: 72 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d 2e 79 6d  rcle->aBox[i].ym
13e0: 69 6e 20 0a 20 20 20 20 20 26 26 20 79 6d 61 78  in .     && ymax
13f0: 3e 3d 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b  >=pCircle->aBox[
1400: 69 5d 2e 79 6d 61 78 20 0a 20 20 20 20 29 7b 0a  i].ymax .    ){.
1410: 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1420: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1430: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1440: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70 65   }..  /* The spe
1450: 63 69 66 69 65 64 20 62 6f 75 6e 64 69 6e 67 20  cified bounding 
1460: 62 6f 78 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74  box does not int
1470: 65 72 73 65 63 74 20 74 68 65 20 63 69 72 63 75  ersect the circu
1480: 6c 61 72 20 72 65 67 69 6f 6e 2e 20 53 65 74 0a  lar region. Set.
1490: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20    ** the output 
14a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 7a 65 72 6f  variable to zero
14b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
14c0: 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 2a 70 52 65  TE_OK. */.  *pRe
14d0: 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
14e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1500: 6f 6e 20 6f 66 20 22 63 69 72 63 6c 65 22 20 72  on of "circle" r
1510: 2d 74 72 65 65 20 67 65 6f 6d 65 74 72 79 20 63  -tree geometry c
1520: 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
1530: 65 20 0a 2a 2a 20 32 6e 64 2d 67 65 6e 65 72 61  e .** 2nd-genera
1540: 74 69 6f 6e 20 69 6e 74 65 72 66 61 63 65 20 74  tion interface t
1550: 68 61 74 20 61 6c 6c 6f 77 73 20 73 63 6f 72 69  hat allows scori
1560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 63 61  ng..**.** Two ca
1570: 6c 6c 69 6e 67 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  lling forms:.**.
1580: 2a 2a 20 20 20 20 20 20 20 20 20 20 51 63 69 72  **          Qcir
1590: 63 6c 65 28 58 2c 59 2c 52 61 64 69 75 73 2c 65  cle(X,Y,Radius,e
15a0: 54 79 70 65 29 20 20 20 20 20 20 20 20 2d 2d 20  Type)        -- 
15b0: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 64  All values are d
15c0: 6f 75 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  oubles.**       
15d0: 20 20 20 51 63 69 72 63 6c 65 28 27 78 3a 58 20     Qcircle('x:X 
15e0: 79 3a 59 20 72 3a 52 20 65 3a 45 54 59 50 45 27  y:Y r:R e:ETYPE'
15f0: 29 20 20 20 2d 2d 20 53 69 6e 67 6c 65 20 73 74  )   -- Single st
1600: 72 69 6e 67 20 70 61 72 61 6d 65 74 65 72 0a 2a  ring parameter.*
1610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69 72  /.static int cir
1620: 63 6c 65 5f 71 75 65 72 79 5f 66 75 6e 63 28 73  cle_query_func(s
1630: 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 71 75 65  qlite3_rtree_que
1640: 72 79 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ry_info *p){.  i
1650: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1670: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1680: 62 6c 65 20 2a 2f 0a 20 20 43 69 72 63 6c 65 20  ble */.  Circle 
1690: 2a 70 43 69 72 63 6c 65 3b 20 20 20 20 20 20 20  *pCircle;       
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
16b0: 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20 63  cture defining c
16c0: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 2a  ircular region *
16d0: 2f 0a 20 20 64 6f 75 62 6c 65 20 78 6d 69 6e 2c  /.  double xmin,
16e0: 20 78 6d 61 78 3b 20 20 20 20 20 20 20 20 20 20   xmax;          
16f0: 20 20 20 20 2f 2a 20 58 20 64 69 6d 65 6e 73 69      /* X dimensi
1700: 6f 6e 73 20 6f 66 20 62 6f 78 20 62 65 69 6e 67  ons of box being
1710: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 64 6f 75   tested */.  dou
1720: 62 6c 65 20 79 6d 69 6e 2c 20 79 6d 61 78 3b 20  ble ymin, ymax; 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 58 20 64 69 6d 65 6e 73 69 6f 6e 73 20 6f 66 20  X dimensions of 
1750: 62 6f 78 20 62 65 69 6e 67 20 74 65 73 74 65 64  box being tested
1760: 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 69 74 68 69   */.  int nWithi
1770: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1790: 6f 66 20 63 6f 72 6e 65 72 73 20 69 6e 73 69 64  of corners insid
17a0: 65 20 74 68 65 20 63 69 72 63 6c 65 20 2a 2f 0a  e the circle */.
17b0: 0a 20 20 78 6d 69 6e 20 3d 20 70 2d 3e 61 43 6f  .  xmin = p->aCo
17c0: 6f 72 64 5b 30 5d 3b 0a 20 20 78 6d 61 78 20 3d  ord[0];.  xmax =
17d0: 20 70 2d 3e 61 43 6f 6f 72 64 5b 31 5d 3b 0a 20   p->aCoord[1];. 
17e0: 20 79 6d 69 6e 20 3d 20 70 2d 3e 61 43 6f 6f 72   ymin = p->aCoor
17f0: 64 5b 32 5d 3b 0a 20 20 79 6d 61 78 20 3d 20 70  d[2];.  ymax = p
1800: 2d 3e 61 43 6f 6f 72 64 5b 33 5d 3b 0a 20 20 70  ->aCoord[3];.  p
1810: 43 69 72 63 6c 65 20 3d 20 28 43 69 72 63 6c 65  Circle = (Circle
1820: 20 2a 29 70 2d 3e 70 55 73 65 72 3b 0a 20 20 69   *)p->pUser;.  i
1830: 66 28 20 70 43 69 72 63 6c 65 3d 3d 30 20 29 7b  f( pCircle==0 ){
1840: 0a 20 20 20 20 2f 2a 20 49 66 20 70 55 73 65 72  .    /* If pUser
1850: 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
1860: 6e 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  n the parameter 
1870: 76 61 6c 75 65 73 20 68 61 76 65 20 6e 6f 74 20  values have not 
1880: 62 65 65 6e 20 74 65 73 74 65 64 0a 20 20 20 20  been tested.    
1890: 2a 2a 20 66 6f 72 20 63 6f 72 72 65 63 74 6e 65  ** for correctne
18a0: 73 73 20 6f 72 20 73 74 6f 72 65 64 20 69 6e 74  ss or stored int
18b0: 6f 20 61 20 43 69 72 63 6c 65 20 73 74 72 75 63  o a Circle struc
18c0: 74 75 72 65 20 79 65 74 2e 20 44 6f 20 74 68 69  ture yet. Do thi
18d0: 73 20 6e 6f 77 2e 20 2a 2f 0a 0a 20 20 20 20 2f  s now. */..    /
18e0: 2a 20 54 68 69 73 20 67 65 6f 6d 65 74 72 79 20  * This geometry 
18f0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 66 6f 72 20  callback is for 
1900: 75 73 65 20 77 69 74 68 20 61 20 32 2d 64 69 6d  use with a 2-dim
1910: 65 6e 73 69 6f 6e 61 6c 20 72 2d 74 72 65 65 20  ensional r-tree 
1920: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 52 65  table..    ** Re
1930: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66  turn an error if
1940: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
1950: 6e 6f 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  not have exactly
1960: 20 32 20 64 69 6d 65 6e 73 69 6f 6e 73 2e 20 2a   2 dimensions. *
1970: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 43 6f  /.    if( p->nCo
1980: 6f 72 64 21 3d 34 20 29 20 72 65 74 75 72 6e 20  ord!=4 ) return 
1990: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
19a0: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 61 74 20     /* Test that 
19b0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
19c0: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
19d0: 20 28 31 20 6f 72 20 34 29 20 68 61 76 65 20 62   (1 or 4) have b
19e0: 65 65 6e 20 73 75 70 70 6c 69 65 64 2e 0a 20 20  een supplied..  
19f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1a00: 6e 50 61 72 61 6d 21 3d 34 20 26 26 20 70 2d 3e  nParam!=4 && p->
1a10: 6e 50 61 72 61 6d 21 3d 31 20 29 20 72 65 74 75  nParam!=1 ) retu
1a20: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1a30: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
1a40: 65 20 61 20 73 74 72 75 63 74 75 72 65 20 74 6f  e a structure to
1a50: 20 63 61 63 68 65 20 70 61 72 61 6d 65 74 65 72   cache parameter
1a60: 20 64 61 74 61 20 69 6e 2e 20 52 65 74 75 72 6e   data in. Return
1a70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
1a80: 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f    ** if the allo
1a90: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 2a 2f  cation fails. */
1aa0: 0a 20 20 20 20 70 43 69 72 63 6c 65 20 3d 20 28  .    pCircle = (
1ab0: 43 69 72 63 6c 65 20 2a 29 28 70 2d 3e 70 55 73  Circle *)(p->pUs
1ac0: 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  er = sqlite3_mal
1ad0: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 69 72 63 6c  loc(sizeof(Circl
1ae0: 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  e)));.    if( !p
1af0: 43 69 72 63 6c 65 20 29 20 72 65 74 75 72 6e 20  Circle ) return 
1b00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b10: 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20 3d 20    p->xDelUser = 
1b20: 63 69 72 63 6c 65 5f 64 65 6c 3b 0a 0a 20 20 20  circle_del;..   
1b30: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
1b40: 65 6e 74 65 72 20 61 6e 64 20 72 61 64 69 75 73  enter and radius
1b50: 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61 72   of the circular
1b60: 20 72 65 67 69 6f 6e 2e 20 4f 6e 65 20 77 61 79   region. One way
1b70: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 65 73   that.    ** tes
1b80: 74 65 64 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  ted bounding box
1b90: 65 73 20 74 68 61 74 20 69 6e 74 65 72 73 65 63  es that intersec
1ba0: 74 20 74 68 65 20 63 69 72 63 75 6c 61 72 20 72  t the circular r
1bb0: 65 67 69 6f 6e 20 61 72 65 20 64 65 74 65 63 74  egion are detect
1bc0: 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 62 79 20  ed.    ** is by 
1bd0: 74 65 73 74 69 6e 67 20 69 66 20 65 61 63 68 20  testing if each 
1be0: 63 6f 72 6e 65 72 20 6f 66 20 74 68 65 20 62 6f  corner of the bo
1bf0: 75 6e 64 69 6e 67 20 62 6f 78 20 6c 69 65 73 20  unding box lies 
1c00: 77 69 74 68 69 6e 20 72 61 64 69 75 73 0a 20 20  within radius.  
1c10: 20 20 2a 2a 20 75 6e 69 74 73 20 6f 66 20 74 68    ** units of th
1c20: 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68 65 20  e center of the 
1c30: 63 69 72 63 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  circle. */.    i
1c40: 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3d 3d 34 20  f( p->nParam==4 
1c50: 29 7b 0a 20 20 20 20 20 20 70 43 69 72 63 6c 65  ){.      pCircle
1c60: 2d 3e 63 65 6e 74 65 72 78 20 3d 20 70 2d 3e 61  ->centerx = p->a
1c70: 50 61 72 61 6d 5b 30 5d 3b 0a 20 20 20 20 20 20  Param[0];.      
1c80: 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 79  pCircle->centery
1c90: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b   = p->aParam[1];
1ca0: 0a 20 20 20 20 20 20 70 43 69 72 63 6c 65 2d 3e  .      pCircle->
1cb0: 72 61 64 69 75 73 20 3d 20 70 2d 3e 61 50 61 72  radius = p->aPar
1cc0: 61 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 70 43 69  am[2];.      pCi
1cd0: 72 63 6c 65 2d 3e 65 53 63 6f 72 65 54 79 70 65  rcle->eScoreType
1ce0: 20 3d 20 28 69 6e 74 29 70 2d 3e 61 50 61 72 61   = (int)p->aPara
1cf0: 6d 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  m[3];.    }else{
1d00: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d10: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
1d20: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1d30: 65 5f 74 65 78 74 28 70 2d 3e 61 70 53 71 6c 50  e_text(p->apSqlP
1d40: 61 72 61 6d 5b 30 5d 29 3b 0a 20 20 20 20 20 20  aram[0]);.      
1d50: 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 78  pCircle->centerx
1d60: 20 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20 70 43   = 0.0;.      pC
1d70: 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 79 20 3d  ircle->centery =
1d80: 20 30 2e 30 3b 0a 20 20 20 20 20 20 70 43 69 72   0.0;.      pCir
1d90: 63 6c 65 2d 3e 72 61 64 69 75 73 20 3d 20 30 2e  cle->radius = 0.
1da0: 30 3b 0a 20 20 20 20 20 20 70 43 69 72 63 6c 65  0;.      pCircle
1db0: 2d 3e 65 53 63 6f 72 65 54 79 70 65 20 3d 20 30  ->eScoreType = 0
1dc0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
1dd0: 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20   && z[0] ){.    
1de0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 72      if( z[0]=='r
1df0: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 3a 27 20 29  ' && z[1]==':' )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 69 72  {.          pCir
1e10: 63 6c 65 2d 3e 72 61 64 69 75 73 20 3d 20 61 74  cle->radius = at
1e20: 6f 66 28 26 7a 5b 32 5d 29 3b 0a 20 20 20 20 20  of(&z[2]);.     
1e30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30     }else if( z[0
1e40: 5d 3d 3d 27 78 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='x' && z[1]==
1e50: 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ':' ){.         
1e60: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
1e70: 78 20 3d 20 61 74 6f 66 28 26 7a 5b 32 5d 29 3b  x = atof(&z[2]);
1e80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e90: 66 28 20 7a 5b 30 5d 3d 3d 27 79 27 20 26 26 20  f( z[0]=='y' && 
1ea0: 7a 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20  z[1]==':' ){.   
1eb0: 20 20 20 20 20 20 20 70 43 69 72 63 6c 65 2d 3e         pCircle->
1ec0: 63 65 6e 74 65 72 79 20 3d 20 61 74 6f 66 28 26  centery = atof(&
1ed0: 7a 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[2]);.        }
1ee0: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
1ef0: 65 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 3a 27 20  e' && z[1]==':' 
1f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 69  ){.          pCi
1f10: 72 63 6c 65 2d 3e 65 53 63 6f 72 65 54 79 70 65  rcle->eScoreType
1f20: 20 3d 20 28 69 6e 74 29 61 74 6f 66 28 26 7a 5b   = (int)atof(&z[
1f30: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  2]);.        }el
1f40: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 20 27  se if( z[0]==' '
1f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b   ){.          z+
1f60: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
1f70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1f80: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1f90: 7a 5b 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d 21  z[0]!=0 && z[0]!
1fa0: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  =' ' ) z++;.    
1fb0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d      while( z[0]=
1fc0: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  =' ' ) z++;.    
1fd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1fe0: 28 20 70 43 69 72 63 6c 65 2d 3e 72 61 64 69 75  ( pCircle->radiu
1ff0: 73 3c 30 2e 30 20 29 7b 0a 20 20 20 20 20 20 73  s<0.0 ){.      s
2000: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 69 72  qlite3_free(pCir
2010: 63 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  cle);.      retu
2020: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2030: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
2040: 65 66 69 6e 65 20 74 77 6f 20 62 6f 75 6e 64 69  efine two boundi
2050: 6e 67 20 62 6f 78 20 72 65 67 69 6f 6e 73 2e 20  ng box regions. 
2060: 54 68 65 20 66 69 72 73 74 2c 20 61 42 6f 78 5b  The first, aBox[
2070: 30 5d 2c 20 65 78 74 65 6e 64 73 20 74 6f 0a 20  0], extends to. 
2080: 20 20 20 2a 2a 20 69 6e 66 69 6e 69 74 79 20 69     ** infinity i
2090: 6e 20 74 68 65 20 58 20 64 69 6d 65 6e 73 69 6f  n the X dimensio
20a0: 6e 2e 20 49 74 20 63 6f 76 65 72 73 20 74 68 65  n. It covers the
20b0: 20 73 61 6d 65 20 72 61 6e 67 65 20 6f 66 20 74   same range of t
20c0: 68 65 20 59 20 64 69 6d 65 6e 73 69 6f 6e 0a 20  he Y dimension. 
20d0: 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63 69 72     ** as the cir
20e0: 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20 54 68  cular region. Th
20f0: 65 20 73 65 63 6f 6e 64 2c 20 61 42 6f 78 5b 31  e second, aBox[1
2100: 5d 2c 20 65 78 74 65 6e 64 73 20 74 6f 20 69 6e  ], extends to in
2110: 66 69 6e 69 74 79 20 69 6e 0a 20 20 20 20 2a 2a  finity in.    **
2120: 20 74 68 65 20 59 20 64 69 6d 65 6e 73 69 6f 6e   the Y dimension
2130: 20 61 6e 64 20 69 73 20 63 6f 6e 73 74 72 61 69   and is constrai
2140: 6e 65 64 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ned to the range
2150: 20 6f 66 20 74 68 65 20 63 69 72 63 6c 65 20 69   of the circle i
2160: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 58 20 64  n the.    ** X d
2170: 69 6d 65 6e 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a  imension..    **
2180: 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 69 6d 61  .    ** Then ima
2190: 67 69 6e 65 20 65 61 63 68 20 62 6f 78 20 69 73  gine each box is
21a0: 20 73 70 6c 69 74 20 69 6e 20 68 61 6c 66 20 61   split in half a
21b0: 6c 6f 6e 67 20 69 74 73 20 73 68 6f 72 74 20 61  long its short a
21c0: 78 69 73 20 62 79 20 61 20 6c 69 6e 65 0a 20 20  xis by a line.  
21d0: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 72 73    ** that inters
21e0: 65 63 74 73 20 74 68 65 20 63 65 6e 74 65 72 20  ects the center 
21f0: 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61 72 20  of the circular 
2200: 72 65 67 69 6f 6e 2e 20 41 20 62 6f 75 6e 64 69  region. A boundi
2210: 6e 67 20 62 6f 78 0a 20 20 20 20 2a 2a 20 62 65  ng box.    ** be
2220: 69 6e 67 20 74 65 73 74 65 64 20 63 61 6e 20 62  ing tested can b
2230: 65 20 73 61 69 64 20 74 6f 20 69 6e 74 65 72 73  e said to inters
2240: 65 63 74 20 74 68 65 20 63 69 72 63 75 6c 61 72  ect the circular
2250: 20 72 65 67 69 6f 6e 20 69 66 20 69 74 20 63 6f   region if it co
2260: 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 70 6f  ntains.    ** po
2270: 69 6e 74 73 20 66 72 6f 6d 20 65 61 63 68 20 68  ints from each h
2280: 61 6c 66 20 6f 66 20 65 69 74 68 65 72 20 6f 66  alf of either of
2290: 20 74 68 65 20 74 77 6f 20 69 6e 66 69 6e 69 74   the two infinit
22a0: 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 65 73  e bounding boxes
22b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 69  ..    */.    pCi
22c0: 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 78 6d  rcle->aBox[0].xm
22d0: 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65  in = pCircle->ce
22e0: 6e 74 65 72 78 3b 0a 20 20 20 20 70 43 69 72 63  nterx;.    pCirc
22f0: 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 78 6d 61 78  le->aBox[0].xmax
2300: 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74   = pCircle->cent
2310: 65 72 78 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  erx;.    pCircle
2320: 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 69 6e 20 3d  ->aBox[0].ymin =
2330: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
2340: 79 20 2b 20 70 43 69 72 63 6c 65 2d 3e 72 61 64  y + pCircle->rad
2350: 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  ius;.    pCircle
2360: 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 61 78 20 3d  ->aBox[0].ymax =
2370: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
2380: 79 20 2d 20 70 43 69 72 63 6c 65 2d 3e 72 61 64  y - pCircle->rad
2390: 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  ius;.    pCircle
23a0: 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 69 6e 20 3d  ->aBox[1].xmin =
23b0: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
23c0: 78 20 2b 20 70 43 69 72 63 6c 65 2d 3e 72 61 64  x + pCircle->rad
23d0: 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  ius;.    pCircle
23e0: 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 61 78 20 3d  ->aBox[1].xmax =
23f0: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
2400: 78 20 2d 20 70 43 69 72 63 6c 65 2d 3e 72 61 64  x - pCircle->rad
2410: 69 75 73 3b 0a 20 20 20 20 70 43 69 72 63 6c 65  ius;.    pCircle
2420: 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 69 6e 20 3d  ->aBox[1].ymin =
2430: 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72   pCircle->center
2440: 79 3b 0a 20 20 20 20 70 43 69 72 63 6c 65 2d 3e  y;.    pCircle->
2450: 61 42 6f 78 5b 31 5d 2e 79 6d 61 78 20 3d 20 70  aBox[1].ymax = p
2460: 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 79 3b  Circle->centery;
2470: 0a 20 20 20 20 70 43 69 72 63 6c 65 2d 3e 6d 78  .    pCircle->mx
2480: 41 72 65 61 20 3d 20 32 30 30 2e 30 2a 32 30 30  Area = 200.0*200
2490: 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  .0;.  }..  /* Ch
24a0: 65 63 6b 20 69 66 20 61 6e 79 20 6f 66 20 74 68  eck if any of th
24b0: 65 20 34 20 63 6f 72 6e 65 72 73 20 6f 66 20 74  e 4 corners of t
24c0: 68 65 20 62 6f 75 6e 64 69 6e 67 2d 62 6f 78 20  he bounding-box 
24d0: 62 65 69 6e 67 20 74 65 73 74 65 64 20 6c 69 65  being tested lie
24e0: 20 0a 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68   .  ** inside th
24f0: 65 20 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f  e circular regio
2500: 6e 2e 20 49 66 20 74 68 65 79 20 64 6f 2c 20 74  n. If they do, t
2510: 68 65 6e 20 74 68 65 20 62 6f 75 6e 64 69 6e 67  hen the bounding
2520: 2d 62 6f 78 20 64 6f 65 73 0a 20 20 2a 2a 20 69  -box does.  ** i
2530: 6e 74 65 72 73 65 63 74 20 74 68 65 20 72 65 67  ntersect the reg
2540: 69 6f 6e 20 6f 66 20 69 6e 74 65 72 65 73 74 2e  ion of interest.
2550: 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2560: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65  variable to true
2570: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
2580: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6e 20 74 68   SQLITE_OK in th
2590: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66 6f  is case. */.  fo
25a0: 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=0; i<4; i++)
25b0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 20 3d  {.    double x =
25c0: 20 28 69 26 30 78 30 31 29 20 3f 20 78 6d 61 78   (i&0x01) ? xmax
25d0: 20 3a 20 78 6d 69 6e 3b 0a 20 20 20 20 64 6f 75   : xmin;.    dou
25e0: 62 6c 65 20 79 20 3d 20 28 69 26 30 78 30 32 29  ble y = (i&0x02)
25f0: 20 3f 20 79 6d 61 78 20 3a 20 79 6d 69 6e 3b 0a   ? ymax : ymin;.
2600: 20 20 20 20 64 6f 75 62 6c 65 20 64 32 3b 0a 20      double d2;. 
2610: 20 20 20 0a 20 20 20 20 64 32 20 20 3d 20 28 78     .    d2  = (x
2620: 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72  -pCircle->center
2630: 78 29 2a 28 78 2d 70 43 69 72 63 6c 65 2d 3e 63  x)*(x-pCircle->c
2640: 65 6e 74 65 72 78 29 3b 0a 20 20 20 20 64 32 20  enterx);.    d2 
2650: 2b 3d 20 28 79 2d 70 43 69 72 63 6c 65 2d 3e 63  += (y-pCircle->c
2660: 65 6e 74 65 72 79 29 2a 28 79 2d 70 43 69 72 63  entery)*(y-pCirc
2670: 6c 65 2d 3e 63 65 6e 74 65 72 79 29 3b 0a 20 20  le->centery);.  
2680: 20 20 69 66 28 20 64 32 3c 28 70 43 69 72 63 6c    if( d2<(pCircl
2690: 65 2d 3e 72 61 64 69 75 73 2a 70 43 69 72 63 6c  e->radius*pCircl
26a0: 65 2d 3e 72 61 64 69 75 73 29 20 29 20 6e 57 69  e->radius) ) nWi
26b0: 74 68 69 6e 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  thin++;.  }..  /
26c0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 62  * Check if the b
26d0: 6f 75 6e 64 69 6e 67 20 62 6f 78 20 63 6f 76 65  ounding box cove
26e0: 72 73 20 61 6e 79 20 6f 74 68 65 72 20 70 61 72  rs any other par
26f0: 74 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61  t of the circula
2700: 72 20 72 65 67 69 6f 6e 2e 0a 20 20 2a 2a 20 53  r region..  ** S
2710: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
2720: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
2730: 69 6f 6e 20 6f 66 20 68 6f 77 20 74 68 69 73 20  ion of how this 
2740: 74 65 73 74 20 77 6f 72 6b 73 2e 20 49 66 20 69  test works. If i
2750: 74 20 64 6f 65 73 0a 20 20 2a 2a 20 63 6f 76 65  t does.  ** cove
2760: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 69  r part of the ci
2770: 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2c 20 73  rcular region, s
2780: 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2790: 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 0a 20  riable to true. 
27a0: 20 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53   ** and return S
27b0: 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 69  QLITE_OK. */.  i
27c0: 66 28 20 6e 57 69 74 68 69 6e 3d 3d 30 20 29 7b  f( nWithin==0 ){
27d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27e0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  2; i++){.      i
27f0: 66 28 20 78 6d 69 6e 3c 3d 70 43 69 72 63 6c 65  f( xmin<=pCircle
2800: 2d 3e 61 42 6f 78 5b 69 5d 2e 78 6d 69 6e 20 0a  ->aBox[i].xmin .
2810: 20 20 20 20 20 20 20 26 26 20 78 6d 61 78 3e 3d         && xmax>=
2820: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d  pCircle->aBox[i]
2830: 2e 78 6d 61 78 20 0a 20 20 20 20 20 20 20 26 26  .xmax .       &&
2840: 20 79 6d 69 6e 3c 3d 70 43 69 72 63 6c 65 2d 3e   ymin<=pCircle->
2850: 61 42 6f 78 5b 69 5d 2e 79 6d 69 6e 20 0a 20 20  aBox[i].ymin .  
2860: 20 20 20 20 20 26 26 20 79 6d 61 78 3e 3d 70 43       && ymax>=pC
2870: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d 2e 79  ircle->aBox[i].y
2880: 6d 61 78 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  max .      ){.  
2890: 20 20 20 20 20 20 6e 57 69 74 68 69 6e 20 3d 20        nWithin = 
28a0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
28b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 69 72 63    }..  if( pCirc
28d0: 6c 65 2d 3e 65 53 63 6f 72 65 54 79 70 65 3d 3d  le->eScoreType==
28e0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 70 74  1 ){.    /* Dept
28f0: 68 20 66 69 72 73 74 20 73 65 61 72 63 68 20 2a  h first search *
2900: 2f 0a 20 20 20 20 70 2d 3e 72 53 63 6f 72 65 20  /.    p->rScore 
2910: 3d 20 70 2d 3e 69 4c 65 76 65 6c 3b 0a 20 20 7d  = p->iLevel;.  }
2920: 65 6c 73 65 20 69 66 28 20 70 43 69 72 63 6c 65  else if( pCircle
2930: 2d 3e 65 53 63 6f 72 65 54 79 70 65 3d 3d 32 20  ->eScoreType==2 
2940: 29 7b 0a 20 20 20 20 2f 2a 20 42 72 65 61 64 74  ){.    /* Breadt
2950: 68 20 66 69 72 73 74 20 73 65 61 72 63 68 20 2a  h first search *
2960: 2f 0a 20 20 20 20 70 2d 3e 72 53 63 6f 72 65 20  /.    p->rScore 
2970: 3d 20 31 30 30 20 2d 20 70 2d 3e 69 4c 65 76 65  = 100 - p->iLeve
2980: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
2990: 43 69 72 63 6c 65 2d 3e 65 53 63 6f 72 65 54 79  Circle->eScoreTy
29a0: 70 65 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==3 ){.    /* 
29b0: 44 65 70 74 68 2d 66 69 72 73 74 20 73 65 61 72  Depth-first sear
29c0: 63 68 2c 20 65 78 63 65 70 74 20 73 6f 72 74 20  ch, except sort 
29d0: 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 62  the leaf nodes b
29e0: 79 20 61 72 65 61 20 77 69 74 68 0a 20 20 20 20  y area with.    
29f0: 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 61  ** the largest a
2a00: 72 65 61 20 66 69 72 73 74 20 2a 2f 0a 20 20 20  rea first */.   
2a10: 20 69 66 28 20 70 2d 3e 69 4c 65 76 65 6c 3d 3d   if( p->iLevel==
2a20: 31 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53  1 ){.      p->rS
2a30: 63 6f 72 65 20 3d 20 31 2e 30 20 2d 20 28 78 6d  core = 1.0 - (xm
2a40: 61 78 2d 78 6d 69 6e 29 2a 28 79 6d 61 78 2d 79  ax-xmin)*(ymax-y
2a50: 6d 69 6e 29 2f 70 43 69 72 63 6c 65 2d 3e 6d 78  min)/pCircle->mx
2a60: 41 72 65 61 3b 0a 20 20 20 20 20 20 69 66 28 20  Area;.      if( 
2a70: 70 2d 3e 72 53 63 6f 72 65 3c 30 2e 30 31 20 29  p->rScore<0.01 )
2a80: 20 70 2d 3e 72 53 63 6f 72 65 20 3d 20 30 2e 30   p->rScore = 0.0
2a90: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2aa0: 20 20 20 20 70 2d 3e 72 53 63 6f 72 65 20 3d 20      p->rScore = 
2ab0: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0.0;.    }.  }el
2ac0: 73 65 20 69 66 28 20 70 43 69 72 63 6c 65 2d 3e  se if( pCircle->
2ad0: 65 53 63 6f 72 65 54 79 70 65 3d 3d 34 20 29 7b  eScoreType==4 ){
2ae0: 0a 20 20 20 20 2f 2a 20 44 65 70 74 68 2d 66 69  .    /* Depth-fi
2af0: 72 73 74 20 73 65 61 72 63 68 2c 20 65 78 63 65  rst search, exce
2b00: 70 74 20 65 78 63 6c 75 64 65 20 6f 64 64 20 72  pt exclude odd r
2b10: 6f 77 69 64 73 20 2a 2f 0a 20 20 20 20 70 2d 3e  owids */.    p->
2b20: 72 53 63 6f 72 65 20 3d 20 70 2d 3e 69 4c 65 76  rScore = p->iLev
2b30: 65 6c 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  el;.    if( p->i
2b40: 52 6f 77 69 64 26 31 20 29 20 6e 57 69 74 68 69  Rowid&1 ) nWithi
2b50: 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 0;.  }else{.
2b60: 20 20 20 20 2f 2a 20 42 72 65 61 64 74 68 2d 66      /* Breadth-f
2b70: 69 72 73 74 20 73 65 61 72 63 68 2c 20 65 78 63  irst search, exc
2b80: 65 70 74 20 65 78 63 6c 75 64 65 20 6f 64 64 20  ept exclude odd 
2b90: 72 6f 77 69 64 73 20 2a 2f 0a 20 20 20 20 70 2d  rowids */.    p-
2ba0: 3e 72 53 63 6f 72 65 20 3d 20 31 30 30 20 2d 20  >rScore = 100 - 
2bb0: 70 2d 3e 69 4c 65 76 65 6c 3b 0a 20 20 20 20 69  p->iLevel;.    i
2bc0: 66 28 20 70 2d 3e 69 52 6f 77 69 64 26 31 20 29  f( p->iRowid&1 )
2bd0: 20 6e 57 69 74 68 69 6e 20 3d 20 30 3b 0a 20 20   nWithin = 0;.  
2be0: 7d 0a 20 20 69 66 28 20 6e 57 69 74 68 69 6e 3d  }.  if( nWithin=
2bf0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65 57 69  =0 ){.    p->eWi
2c00: 74 68 69 6e 20 3d 20 4e 4f 54 5f 57 49 54 48 49  thin = NOT_WITHI
2c10: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  N;.  }else if( n
2c20: 57 69 74 68 69 6e 3e 3d 34 20 29 7b 0a 20 20 20  Within>=4 ){.   
2c30: 20 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 46 55   p->eWithin = FU
2c40: 4c 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 7d 65  LLY_WITHIN;.  }e
2c50: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 57 69 74  lse{.    p->eWit
2c60: 68 69 6e 20 3d 20 50 41 52 54 4c 59 5f 57 49 54  hin = PARTLY_WIT
2c70: 48 49 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  HIN;.  }.  retur
2c80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
2c90: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2ca0: 69 6f 6e 20 6f 66 20 22 62 72 65 61 64 74 68 66  ion of "breadthf
2cb0: 69 72 73 74 73 65 61 72 63 68 22 20 72 2d 74 72  irstsearch" r-tr
2cc0: 65 65 20 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c  ee geometry call
2cd0: 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 0a  back using the .
2ce0: 2a 2a 20 32 6e 64 2d 67 65 6e 65 72 61 74 69 6f  ** 2nd-generatio
2cf0: 6e 20 69 6e 74 65 72 66 61 63 65 20 74 68 61 74  n interface that
2d00: 20 61 6c 6c 6f 77 73 20 73 63 6f 72 69 6e 67 2e   allows scoring.
2d10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
2d20: 48 45 52 45 20 69 64 20 4d 41 54 43 48 20 62 72  HERE id MATCH br
2d30: 65 61 64 74 68 66 69 72 73 74 73 65 61 72 63 68  eadthfirstsearch
2d40: 28 24 78 30 2c 24 78 31 2c 24 79 30 2c 24 79 31  ($x0,$x1,$y0,$y1
2d50: 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 72  ) ....**.** It r
2d60: 65 74 75 72 6e 73 20 61 6c 6c 20 65 6e 74 72 69  eturns all entri
2d70: 65 73 20 77 68 6f 73 65 20 62 6f 75 6e 64 69 6e  es whose boundin
2d80: 67 20 62 6f 78 65 73 20 6f 76 65 72 6c 61 70 20  g boxes overlap 
2d90: 77 69 74 68 20 24 78 30 2c 24 78 31 2c 24 79 30  with $x0,$x1,$y0
2da0: 2c 24 79 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ,$y1..*/.static 
2db0: 69 6e 74 20 62 66 73 5f 71 75 65 72 79 5f 66 75  int bfs_query_fu
2dc0: 6e 63 28 73 71 6c 69 74 65 33 5f 72 74 72 65 65  nc(sqlite3_rtree
2dd0: 5f 71 75 65 72 79 5f 69 6e 66 6f 20 2a 70 29 7b  _query_info *p){
2de0: 0a 20 20 64 6f 75 62 6c 65 20 78 30 2c 78 31 2c  .  double x0,x1,
2df0: 79 30 2c 79 31 3b 20 20 20 20 20 20 20 20 2f 2a  y0,y1;        /*
2e00: 20 44 69 6d 65 6e 73 69 6f 6e 73 20 6f 66 20 62   Dimensions of b
2e10: 6f 78 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  ox being tested 
2e20: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 62 78 30 2c  */.  double bx0,
2e30: 62 78 31 2c 62 79 30 2c 62 79 31 3b 20 20 20 20  bx1,by0,by1;    
2e40: 2f 2a 20 42 6f 75 6e 64 61 72 79 20 6f 66 20 74  /* Boundary of t
2e50: 68 65 20 71 75 65 72 79 20 66 75 6e 63 74 69 6f  he query functio
2e60: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  n */..  if( p->n
2e70: 50 61 72 61 6d 21 3d 34 20 29 20 72 65 74 75 72  Param!=4 ) retur
2e80: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2e90: 20 20 78 30 20 3d 20 70 2d 3e 61 43 6f 6f 72 64    x0 = p->aCoord
2ea0: 5b 30 5d 3b 0a 20 20 78 31 20 3d 20 70 2d 3e 61  [0];.  x1 = p->a
2eb0: 43 6f 6f 72 64 5b 31 5d 3b 0a 20 20 79 30 20 3d  Coord[1];.  y0 =
2ec0: 20 70 2d 3e 61 43 6f 6f 72 64 5b 32 5d 3b 0a 20   p->aCoord[2];. 
2ed0: 20 79 31 20 3d 20 70 2d 3e 61 43 6f 6f 72 64 5b   y1 = p->aCoord[
2ee0: 33 5d 3b 0a 20 20 62 78 30 20 3d 20 70 2d 3e 61  3];.  bx0 = p->a
2ef0: 50 61 72 61 6d 5b 30 5d 3b 0a 20 20 62 78 31 20  Param[0];.  bx1 
2f00: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b 0a  = p->aParam[1];.
2f10: 20 20 62 79 30 20 3d 20 70 2d 3e 61 50 61 72 61    by0 = p->aPara
2f20: 6d 5b 32 5d 3b 0a 20 20 62 79 31 20 3d 20 70 2d  m[2];.  by1 = p-
2f30: 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 20 20 70 2d  >aParam[3];.  p-
2f40: 3e 72 53 63 6f 72 65 20 3d 20 31 30 30 20 2d 20  >rScore = 100 - 
2f50: 70 2d 3e 69 4c 65 76 65 6c 3b 0a 20 20 69 66 28  p->iLevel;.  if(
2f60: 20 70 2d 3e 65 50 61 72 65 6e 74 57 69 74 68 69   p->eParentWithi
2f70: 6e 3d 3d 46 55 4c 4c 59 5f 57 49 54 48 49 4e 20  n==FULLY_WITHIN 
2f80: 29 7b 0a 20 20 20 20 70 2d 3e 65 57 69 74 68 69  ){.    p->eWithi
2f90: 6e 20 3d 20 46 55 4c 4c 59 5f 57 49 54 48 49 4e  n = FULLY_WITHIN
2fa0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 78 30  ;.  }else if( x0
2fb0: 3e 3d 62 78 30 20 26 26 20 78 31 3c 3d 62 78 31  >=bx0 && x1<=bx1
2fc0: 20 26 26 20 79 30 3e 3d 62 79 30 20 26 26 20 79   && y0>=by0 && y
2fd0: 31 3c 3d 62 79 31 20 29 7b 0a 20 20 20 20 70 2d  1<=by1 ){.    p-
2fe0: 3e 65 57 69 74 68 69 6e 20 3d 20 46 55 4c 4c 59  >eWithin = FULLY
2ff0: 5f 57 49 54 48 49 4e 3b 0a 20 20 7d 65 6c 73 65  _WITHIN;.  }else
3000: 20 69 66 28 20 78 31 3e 3d 62 78 30 20 26 26 20   if( x1>=bx0 && 
3010: 78 30 3c 3d 62 78 31 20 26 26 20 79 31 3e 3d 62  x0<=bx1 && y1>=b
3020: 79 30 20 26 26 20 79 30 3c 3d 62 79 31 20 29 7b  y0 && y0<=by1 ){
3030: 0a 20 20 20 20 70 2d 3e 65 57 69 74 68 69 6e 20  .    p->eWithin 
3040: 3d 20 50 41 52 54 4c 59 5f 57 49 54 48 49 4e 3b  = PARTLY_WITHIN;
3050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
3060: 3e 65 57 69 74 68 69 6e 20 3d 20 4e 4f 54 5f 57  >eWithin = NOT_W
3070: 49 54 48 49 4e 3b 0a 20 20 7d 0a 20 20 72 65 74  ITHIN;.  }.  ret
3080: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3090: 0a 0a 2f 2a 20 45 4e 44 20 6f 66 20 69 6d 70 6c  ../* END of impl
30a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63  ementation of "c
30b0: 69 72 63 6c 65 22 20 67 65 6f 6d 65 74 72 79 20  ircle" geometry 
30c0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 2a 2a 2a 2a  callback..******
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
3120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3160: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
3170: 74 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65 64  t.h>.#if defined
3180: 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54 45 5f  (INCLUDE_SQLITE_
3190: 54 43 4c 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64  TCL_H).#  includ
31a0: 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68 22  e "sqlite_tcl.h"
31b0: 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  .#else.#  includ
31c0: 65 20 22 74 63 6c 2e 68 22 0a 23 65 6e 64 69 66  e "tcl.h".#endif
31d0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
31e0: 20 43 75 62 65 20 43 75 62 65 3b 0a 73 74 72 75   Cube Cube;.stru
31f0: 63 74 20 43 75 62 65 20 7b 0a 20 20 64 6f 75 62  ct Cube {.  doub
3200: 6c 65 20 78 3b 0a 20 20 64 6f 75 62 6c 65 20 79  le x;.  double y
3210: 3b 0a 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20  ;.  double z;.  
3220: 64 6f 75 62 6c 65 20 77 69 64 74 68 3b 0a 20 20  double width;.  
3230: 64 6f 75 62 6c 65 20 68 65 69 67 68 74 3b 0a 20  double height;. 
3240: 20 64 6f 75 62 6c 65 20 64 65 70 74 68 3b 0a 7d   double depth;.}
3250: 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  ;..static void c
3260: 75 62 65 5f 63 6f 6e 74 65 78 74 5f 66 72 65 65  ube_context_free
3270: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c  (void *p){.  sql
3280: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
3290: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  ./*.** The conte
32a0: 78 74 20 70 6f 69 6e 74 65 72 20 72 65 67 69 73  xt pointer regis
32b0: 74 65 72 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  tered along with
32c0: 20 74 68 65 20 27 63 75 62 65 27 20 63 61 6c 6c   the 'cube' call
32d0: 62 61 63 6b 20 69 73 0a 2a 2a 20 61 6c 77 61 79  back is.** alway
32e0: 73 20 28 28 76 6f 69 64 20 2a 29 26 67 48 65 72  s ((void *)&gHer
32f0: 65 29 2e 20 54 68 69 73 20 69 73 20 6a 75 73 74  e). This is just
3300: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
3310: 65 73 74 69 6e 67 2c 20 69 74 20 69 73 20 6e 6f  esting, it is no
3320: 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 75 73  t.** actually us
3330: 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 2e  ed for anything.
3340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
3350: 48 65 72 65 20 3d 20 34 32 3b 0a 0a 2f 2a 0a 2a  Here = 42;../*.*
3360: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3370: 20 6f 66 20 61 20 73 69 6d 70 6c 65 20 72 2d 74   of a simple r-t
3380: 72 65 65 20 67 65 6f 6d 20 63 61 6c 6c 62 61 63  ree geom callbac
3390: 6b 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6e  k to test for in
33a0: 74 65 72 73 65 63 74 69 6f 6e 0a 2a 2a 20 6f 66  tersection.** of
33b0: 20 72 2d 74 72 65 65 20 72 6f 77 73 20 77 69 74   r-tree rows wit
33c0: 68 20 61 20 22 63 75 62 65 22 20 73 68 61 70 65  h a "cube" shape
33d0: 2e 20 43 75 62 65 73 20 61 72 65 20 64 65 66 69  . Cubes are defi
33e0: 6e 65 64 20 62 79 20 73 69 78 20 73 63 61 6c 61  ned by six scala
33f0: 72 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 73  r.** coordinates
3400: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3410: 2a 2a 20 20 20 63 75 62 65 28 78 2c 20 79 2c 20  **   cube(x, y, 
3420: 7a 2c 20 77 69 64 74 68 2c 20 68 65 69 67 68 74  z, width, height
3430: 2c 20 64 65 70 74 68 29 0a 2a 2a 0a 2a 2a 20 54  , depth).**.** T
3440: 68 65 20 77 69 64 74 68 2c 20 68 65 69 67 68 74  he width, height
3450: 20 61 6e 64 20 64 65 70 74 68 20 70 61 72 61 6d   and depth param
3460: 65 74 65 72 73 20 6d 75 73 74 20 61 6c 6c 20 62  eters must all b
3470: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
3480: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
3490: 6e 74 20 63 75 62 65 5f 67 65 6f 6d 28 0a 20 20  nt cube_geom(.  
34a0: 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65  sqlite3_rtree_ge
34b0: 6f 6d 65 74 72 79 20 2a 70 2c 0a 20 20 69 6e 74  ometry *p,.  int
34c0: 20 6e 43 6f 6f 72 64 2c 0a 20 20 73 71 6c 69 74   nCoord,.  sqlit
34d0: 65 33 5f 72 74 72 65 65 5f 64 62 6c 20 2a 61 43  e3_rtree_dbl *aC
34e0: 6f 6f 72 64 2c 0a 20 20 69 6e 74 20 2a 70 69 52  oord,.  int *piR
34f0: 65 73 0a 29 7b 0a 20 20 43 75 62 65 20 2a 70 43  es.){.  Cube *pC
3500: 75 62 65 20 3d 20 28 43 75 62 65 20 2a 29 70 2d  ube = (Cube *)p-
3510: 3e 70 55 73 65 72 3b 0a 0a 20 20 61 73 73 65 72  >pUser;..  asser
3520: 74 28 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3d 3d  t( p->pContext==
3530: 28 76 6f 69 64 20 2a 29 26 67 48 65 72 65 20 29  (void *)&gHere )
3540: 3b 0a 0a 20 20 69 66 28 20 70 43 75 62 65 3d 3d  ;..  if( pCube==
3550: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
3560: 6e 50 61 72 61 6d 21 3d 36 20 7c 7c 20 6e 43 6f  nParam!=6 || nCo
3570: 6f 72 64 21 3d 36 0a 20 20 20 20 20 7c 7c 20 70  ord!=6.     || p
3580: 2d 3e 61 50 61 72 61 6d 5b 33 5d 3c 3d 30 2e 30  ->aParam[3]<=0.0
3590: 20 7c 7c 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d   || p->aParam[4]
35a0: 3c 3d 30 2e 30 20 7c 7c 20 70 2d 3e 61 50 61 72  <=0.0 || p->aPar
35b0: 61 6d 5b 35 5d 3c 3d 30 2e 30 0a 20 20 20 20 29  am[5]<=0.0.    )
35c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
35d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
35e0: 20 7d 0a 20 20 20 20 70 43 75 62 65 20 3d 20 28   }.    pCube = (
35f0: 43 75 62 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  Cube *)sqlite3_m
3600: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 75 62  alloc(sizeof(Cub
3610: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  e));.    if( !pC
3620: 75 62 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ube ){.      ret
3630: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
3640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 62  ;.    }.    pCub
3650: 65 2d 3e 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d  e->x = p->aParam
3660: 5b 30 5d 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e  [0];.    pCube->
3670: 79 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d  y = p->aParam[1]
3680: 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e 7a 20 3d  ;.    pCube->z =
3690: 20 70 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 20   p->aParam[2];. 
36a0: 20 20 20 70 43 75 62 65 2d 3e 77 69 64 74 68 20     pCube->width 
36b0: 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a  = p->aParam[3];.
36c0: 20 20 20 20 70 43 75 62 65 2d 3e 68 65 69 67 68      pCube->heigh
36d0: 74 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d  t = p->aParam[4]
36e0: 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e 64 65 70  ;.    pCube->dep
36f0: 74 68 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 35  th = p->aParam[5
3700: 5d 3b 0a 0a 20 20 20 20 70 2d 3e 70 55 73 65 72  ];..    p->pUser
3710: 20 3d 20 28 76 6f 69 64 20 2a 29 70 43 75 62 65   = (void *)pCube
3720: 3b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 55 73 65  ;.    p->xDelUse
3730: 72 20 3d 20 63 75 62 65 5f 63 6f 6e 74 65 78 74  r = cube_context
3740: 5f 66 72 65 65 3b 0a 20 20 7d 0a 0a 20 20 61 73  _free;.  }..  as
3750: 73 65 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 36 20  sert( nCoord==6 
3760: 29 3b 0a 20 20 2a 70 69 52 65 73 20 3d 20 30 3b  );.  *piRes = 0;
3770: 0a 20 20 69 66 28 20 61 43 6f 6f 72 64 5b 30 5d  .  if( aCoord[0]
3780: 3c 3d 28 70 43 75 62 65 2d 3e 78 2b 70 43 75 62  <=(pCube->x+pCub
3790: 65 2d 3e 77 69 64 74 68 29 0a 20 20 20 26 26 20  e->width).   && 
37a0: 61 43 6f 6f 72 64 5b 31 5d 3e 3d 70 43 75 62 65  aCoord[1]>=pCube
37b0: 2d 3e 78 0a 20 20 20 26 26 20 61 43 6f 6f 72 64  ->x.   && aCoord
37c0: 5b 32 5d 3c 3d 28 70 43 75 62 65 2d 3e 79 2b 70  [2]<=(pCube->y+p
37d0: 43 75 62 65 2d 3e 68 65 69 67 68 74 29 0a 20 20  Cube->height).  
37e0: 20 26 26 20 61 43 6f 6f 72 64 5b 33 5d 3e 3d 70   && aCoord[3]>=p
37f0: 43 75 62 65 2d 3e 79 0a 20 20 20 26 26 20 61 43  Cube->y.   && aC
3800: 6f 6f 72 64 5b 34 5d 3c 3d 28 70 43 75 62 65 2d  oord[4]<=(pCube-
3810: 3e 7a 2b 70 43 75 62 65 2d 3e 64 65 70 74 68 29  >z+pCube->depth)
3820: 0a 20 20 20 26 26 20 61 43 6f 6f 72 64 5b 35 5d  .   && aCoord[5]
3830: 3e 3d 70 43 75 62 65 2d 3e 7a 0a 20 20 29 7b 0a  >=pCube->z.  ){.
3840: 20 20 20 20 2a 70 69 52 65 73 20 3d 20 31 3b 0a      *piRes = 1;.
3850: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
3860: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
3870: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
3880: 4c 45 5f 52 54 52 45 45 20 2a 2f 0a 0a 73 74 61  LE_RTREE */..sta
3890: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
38a0: 43 4c 41 50 49 20 72 65 67 69 73 74 65 72 5f 63  CLAPI register_c
38b0: 75 62 65 5f 67 65 6f 6d 28 0a 20 20 76 6f 69 64  ube_geom(.  void
38c0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
38d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
38e0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
38f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
3900: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
3910: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3920: 45 5f 52 54 52 45 45 0a 20 20 55 4e 55 53 45 44  E_RTREE.  UNUSED
3930: 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65 6e  _PARAMETER(clien
3940: 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45 44  tData);.  UNUSED
3950: 5f 50 41 52 41 4d 45 54 45 52 28 69 6e 74 65 72  _PARAMETER(inter
3960: 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
3970: 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 20 20  AMETER(objc);.  
3980: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3990: 28 6f 62 6a 76 29 3b 0a 23 65 6c 73 65 0a 20 20  (objv);.#else.  
39a0: 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62  extern int getDb
39b0: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
39c0: 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  rp*, const char*
39d0: 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20  , sqlite3**);.  
39e0: 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61  extern const cha
39f0: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  r *sqlite3ErrNam
3a00: 65 28 69 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  e(int);.  sqlite
3a10: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
3a20: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
3a30: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
3a40: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
3a50: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
3a60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3a70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3a80: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3a90: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
3aa0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
3ab0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3ac0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
3ad0: 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
3ae0: 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 64 62 2c  try_callback(db,
3af0: 20 22 63 75 62 65 22 2c 20 63 75 62 65 5f 67 65   "cube", cube_ge
3b00: 6f 6d 2c 20 28 76 6f 69 64 20 2a 29 26 67 48 65  om, (void *)&gHe
3b10: 72 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  re);.  Tcl_SetRe
3b20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
3b30: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
3b40: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
3b50: 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
3b60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
3b80: 54 45 5f 54 43 4c 41 50 49 20 72 65 67 69 73 74  TE_TCLAPI regist
3b90: 65 72 5f 63 69 72 63 6c 65 5f 67 65 6f 6d 28 0a  er_circle_geom(.
3ba0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
3bb0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
3bc0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
3bd0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
3be0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
3bf0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3c00: 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
3c10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3c20: 28 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20  (clientData);.  
3c30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3c40: 28 69 6e 74 65 72 70 29 3b 0a 20 20 55 4e 55 53  (interp);.  UNUS
3c50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a  ED_PARAMETER(obj
3c60: 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
3c70: 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b 0a 23 65  AMETER(objv);.#e
3c80: 6c 73 65 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  lse.  extern int
3c90: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
3ca0: 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74  l_Interp*, const
3cb0: 20 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a   char*, sqlite3*
3cc0: 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 63 6f 6e  *);.  extern con
3cd0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
3ce0: 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 20 20  ErrName(int);.  
3cf0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
3d00: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
3d10: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
3d20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
3d30: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
3d40: 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
3d50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3d60: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
3d70: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
3d80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
3d90: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
3da0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
3db0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65   = sqlite3_rtree
3dc0: 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61  _geometry_callba
3dd0: 63 6b 28 64 62 2c 20 22 63 69 72 63 6c 65 22 2c  ck(db, "circle",
3de0: 20 63 69 72 63 6c 65 5f 67 65 6f 6d 2c 20 30 29   circle_geom, 0)
3df0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
3e00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
3e10: 3d 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  = sqlite3_rtree_
3e20: 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 64  query_callback(d
3e30: 62 2c 20 22 51 63 69 72 63 6c 65 22 2c 0a 20 20  b, "Qcircle",.  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 63 69 72 63 6c 65 5f 71 75 65 72 79      circle_query
3e70: 5f 66 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  _func, 0, 0);.  
3e80: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3e90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
3ea0: 3d 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f  = sqlite3_rtree_
3eb0: 71 75 65 72 79 5f 63 61 6c 6c 62 61 63 6b 28 64  query_callback(d
3ec0: 62 2c 20 22 62 72 65 61 64 74 68 66 69 72 73 74  b, "breadthfirst
3ed0: 73 65 61 72 63 68 22 2c 0a 20 20 20 20 20 20 20  search",.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3f00: 66 73 5f 71 75 65 72 79 5f 66 75 6e 63 2c 20 30  fs_query_func, 0
3f10: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  , 0);.  }.  Tcl_
3f20: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
3f30: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
3f40: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
3f50: 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
3f60: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
3f70: 4b 3b 0a 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65  K;.}..int Sqlite
3f80: 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74 28 54  testrtree_Init(T
3f90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3fa0: 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
3fb0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3fc0: 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63 75 62  p, "register_cub
3fd0: 65 5f 67 65 6f 6d 22 2c 20 72 65 67 69 73 74 65  e_geom", registe
3fe0: 72 5f 63 75 62 65 5f 67 65 6f 6d 2c 20 30 2c 20  r_cube_geom, 0, 
3ff0: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
4000: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
4010: 70 2c 20 22 72 65 67 69 73 74 65 72 5f 63 69 72  p, "register_cir
4020: 63 6c 65 5f 67 65 6f 6d 22 2c 72 65 67 69 73 74  cle_geom",regist
4030: 65 72 5f 63 69 72 63 6c 65 5f 67 65 6f 6d 2c 30  er_circle_geom,0
4040: 2c 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ,0);.  return TC
4050: 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.