/ Hex Artifact Content
Login

Artifact f3d1d12538dccb75fd916e3fa58f250edbdd3b47:


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 3c 73 71 6c 69 74  .#include <sqlit
01f0: 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  e3.h>.#include <
0200: 74 63 6c 2e 68 3e 0a 0a 2f 2a 20 53 6f 6c 65 6c  tcl.h>../* Solel
0210: 79 20 66 6f 72 20 74 68 65 20 55 4e 55 53 45 44  y for the UNUSED
0220: 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63  _PARAMETER() mac
0230: 72 6f 2e 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ro. */.#include 
0240: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23  "sqliteInt.h"..#
0250: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0260: 42 4c 45 5f 52 54 52 45 45 0a 2f 2a 20 0a 2a 2a  BLE_RTREE./* .**
0270: 20 54 79 70 65 20 75 73 65 64 20 74 6f 20 63 61   Type used to ca
0280: 63 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 6e  che parameter in
0290: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
02a0: 65 20 22 63 69 72 63 6c 65 22 20 72 2d 74 72 65  e "circle" r-tre
02b0: 65 20 67 65 6f 6d 65 74 72 79 0a 2a 2a 20 63 61  e geometry.** ca
02c0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79 70 65 64  llback..*/.typed
02d0: 65 66 20 73 74 72 75 63 74 20 43 69 72 63 6c 65  ef struct Circle
02e0: 20 43 69 72 63 6c 65 3b 0a 73 74 72 75 63 74 20   Circle;.struct 
02f0: 43 69 72 63 6c 65 20 7b 0a 20 20 73 74 72 75 63  Circle {.  struc
0300: 74 20 42 6f 78 20 7b 0a 20 20 20 20 64 6f 75 62  t Box {.    doub
0310: 6c 65 20 78 6d 69 6e 3b 0a 20 20 20 20 64 6f 75  le xmin;.    dou
0320: 62 6c 65 20 78 6d 61 78 3b 0a 20 20 20 20 64 6f  ble xmax;.    do
0330: 75 62 6c 65 20 79 6d 69 6e 3b 0a 20 20 20 20 64  uble ymin;.    d
0340: 6f 75 62 6c 65 20 79 6d 61 78 3b 0a 20 20 7d 20  ouble ymax;.  } 
0350: 61 42 6f 78 5b 32 5d 3b 0a 20 20 64 6f 75 62 6c  aBox[2];.  doubl
0360: 65 20 63 65 6e 74 65 72 78 3b 0a 20 20 64 6f 75  e centerx;.  dou
0370: 62 6c 65 20 63 65 6e 74 65 72 79 3b 0a 20 20 64  ble centery;.  d
0380: 6f 75 62 6c 65 20 72 61 64 69 75 73 3b 0a 7d 3b  ouble radius;.};
0390: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74  ../*.** Destruct
03a0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  or function for 
03b0: 43 69 72 63 6c 65 20 6f 62 6a 65 63 74 73 20 61  Circle objects a
03c0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 63 69 72 63  llocated by circ
03d0: 6c 65 5f 67 65 6f 6d 28 29 2e 0a 2a 2f 0a 73 74  le_geom()..*/.st
03e0: 61 74 69 63 20 76 6f 69 64 20 63 69 72 63 6c 65  atic void circle
03f0: 5f 64 65 6c 28 76 6f 69 64 20 2a 70 29 7b 0a 20  _del(void *p){. 
0400: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
0410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
0420: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63 69  mentation of "ci
0430: 72 63 6c 65 22 20 72 2d 74 72 65 65 20 67 65 6f  rcle" r-tree geo
0440: 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a  metry callback..
0450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69  */.static int ci
0460: 72 63 6c 65 5f 67 65 6f 6d 28 0a 20 20 73 71 6c  rcle_geom(.  sql
0470: 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d 65  ite3_rtree_geome
0480: 74 72 79 20 2a 70 2c 0a 20 20 69 6e 74 20 6e 43  try *p,.  int nC
0490: 6f 6f 72 64 2c 20 0a 23 69 66 64 65 66 20 53 51  oord, .#ifdef SQ
04a0: 4c 49 54 45 5f 52 54 52 45 45 5f 49 4e 54 5f 4f  LITE_RTREE_INT_O
04b0: 4e 4c 59 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  NLY.  sqlite3_in
04c0: 74 36 34 20 2a 61 43 6f 6f 72 64 2c 0a 23 65 6c  t64 *aCoord,.#el
04d0: 73 65 0a 20 20 64 6f 75 62 6c 65 20 2a 61 43 6f  se.  double *aCo
04e0: 6f 72 64 2c 20 0a 23 65 6e 64 69 66 0a 20 20 69  ord, .#endif.  i
04f0: 6e 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e  nt *pRes.){.  in
0500: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0520: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
0530: 6c 65 20 2a 2f 0a 20 20 43 69 72 63 6c 65 20 2a  le */.  Circle *
0540: 70 43 69 72 63 6c 65 3b 20 20 20 20 20 20 20 20  pCircle;        
0550: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
0560: 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20 63 69  ture defining ci
0570: 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 20 2a 2f  rcular region */
0580: 0a 20 20 64 6f 75 62 6c 65 20 78 6d 69 6e 2c 20  .  double xmin, 
0590: 78 6d 61 78 3b 20 20 20 20 20 20 20 20 20 20 20  xmax;           
05a0: 20 20 20 2f 2a 20 58 20 64 69 6d 65 6e 73 69 6f     /* X dimensio
05b0: 6e 73 20 6f 66 20 62 6f 78 20 62 65 69 6e 67 20  ns of box being 
05c0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 64 6f 75 62  tested */.  doub
05d0: 6c 65 20 79 6d 69 6e 2c 20 79 6d 61 78 3b 20 20  le ymin, ymax;  
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
05f0: 20 64 69 6d 65 6e 73 69 6f 6e 73 20 6f 66 20 62   dimensions of b
0600: 6f 78 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  ox being tested 
0610: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 73  */..  if( p->pUs
0620: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  er==0 ){.    /* 
0630: 49 66 20 70 55 73 65 72 20 69 73 20 73 74 69 6c  If pUser is stil
0640: 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 70 61  l 0, then the pa
0650: 72 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20 68  rameter values h
0660: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 65 73  ave not been tes
0670: 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  ted.    ** for c
0680: 6f 72 72 65 63 74 6e 65 73 73 20 6f 72 20 73 74  orrectness or st
0690: 6f 72 65 64 20 69 6e 74 6f 20 61 20 43 69 72 63  ored into a Circ
06a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 79 65 74  le structure yet
06b0: 2e 20 44 6f 20 74 68 69 73 20 6e 6f 77 2e 20 2a  . Do this now. *
06c0: 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 67  /..    /* This g
06d0: 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b  eometry callback
06e0: 20 69 73 20 66 6f 72 20 75 73 65 20 77 69 74 68   is for use with
06f0: 20 61 20 32 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c   a 2-dimensional
0700: 20 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 0a 20   r-tree table.. 
0710: 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20     ** Return an 
0720: 65 72 72 6f 72 20 69 66 20 74 68 65 20 74 61 62  error if the tab
0730: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  le does not have
0740: 20 65 78 61 63 74 6c 79 20 32 20 64 69 6d 65 6e   exactly 2 dimen
0750: 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  sions. */.    if
0760: 28 20 6e 43 6f 6f 72 64 21 3d 34 20 29 20 72 65  ( nCoord!=4 ) re
0770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
0780: 52 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 73 74 20  R;..    /* Test 
0790: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
07a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   number of param
07b0: 65 74 65 72 73 20 28 33 29 20 68 61 76 65 20 62  eters (3) have b
07c0: 65 65 6e 20 73 75 70 70 6c 69 65 64 2c 0a 20 20  een supplied,.  
07d0: 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68    ** and that th
07e0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
07f0: 20 69 6e 20 72 61 6e 67 65 20 28 74 68 61 74 20   in range (that 
0800: 74 68 65 20 72 61 64 69 75 73 20 6f 66 20 74 68  the radius of th
0810: 65 20 63 69 72 63 6c 65 20 0a 20 20 20 20 2a 2a  e circle .    **
0820: 20 72 61 64 69 75 73 20 69 73 20 67 72 65 61 74   radius is great
0830: 65 72 20 74 68 61 6e 20 7a 65 72 6f 29 2e 20 2a  er than zero). *
0840: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 61  /.    if( p->nPa
0850: 72 61 6d 21 3d 33 20 7c 7c 20 70 2d 3e 61 50 61  ram!=3 || p->aPa
0860: 72 61 6d 5b 32 5d 3c 30 2e 30 20 29 20 72 65 74  ram[2]<0.0 ) ret
0870: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
0880: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
0890: 74 65 20 61 20 73 74 72 75 63 74 75 72 65 20 74  te a structure t
08a0: 6f 20 63 61 63 68 65 20 70 61 72 61 6d 65 74 65  o cache paramete
08b0: 72 20 64 61 74 61 20 69 6e 2e 20 52 65 74 75 72  r data in. Retur
08c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
08d0: 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
08e0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 2a  ocation fails. *
08f0: 2f 0a 20 20 20 20 70 43 69 72 63 6c 65 20 3d 20  /.    pCircle = 
0900: 28 43 69 72 63 6c 65 20 2a 29 28 70 2d 3e 70 55  (Circle *)(p->pU
0910: 73 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ser = sqlite3_ma
0920: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 69 72 63  lloc(sizeof(Circ
0930: 6c 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 21  le)));.    if( !
0940: 70 43 69 72 63 6c 65 20 29 20 72 65 74 75 72 6e  pCircle ) return
0950: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
0960: 20 20 20 70 2d 3e 78 44 65 6c 55 73 65 72 20 3d     p->xDelUser =
0970: 20 63 69 72 63 6c 65 5f 64 65 6c 3b 0a 0a 20 20   circle_del;..  
0980: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
0990: 63 65 6e 74 65 72 20 61 6e 64 20 72 61 64 69 75  center and radiu
09a0: 73 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c 61  s of the circula
09b0: 72 20 72 65 67 69 6f 6e 2e 20 4f 6e 65 20 77 61  r region. One wa
09c0: 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 65  y that.    ** te
09d0: 73 74 65 64 20 62 6f 75 6e 64 69 6e 67 20 62 6f  sted bounding bo
09e0: 78 65 73 20 74 68 61 74 20 69 6e 74 65 72 73 65  xes that interse
09f0: 63 74 20 74 68 65 20 63 69 72 63 75 6c 61 72 20  ct the circular 
0a00: 72 65 67 69 6f 6e 20 61 72 65 20 64 65 74 65 63  region are detec
0a10: 74 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 62 79  ted.    ** is by
0a20: 20 74 65 73 74 69 6e 67 20 69 66 20 65 61 63 68   testing if each
0a30: 20 63 6f 72 6e 65 72 20 6f 66 20 74 68 65 20 62   corner of the b
0a40: 6f 75 6e 64 69 6e 67 20 62 6f 78 20 6c 69 65 73  ounding box lies
0a50: 20 77 69 74 68 69 6e 20 72 61 64 69 75 73 0a 20   within radius. 
0a60: 20 20 20 2a 2a 20 75 6e 69 74 73 20 6f 66 20 74     ** units of t
0a70: 68 65 20 63 65 6e 74 65 72 20 6f 66 20 74 68 65  he center of the
0a80: 20 63 69 72 63 6c 65 2e 20 2a 2f 0a 20 20 20 20   circle. */.    
0a90: 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65 72 78  pCircle->centerx
0aa0: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 30 5d 3b   = p->aParam[0];
0ab0: 0a 20 20 20 20 70 43 69 72 63 6c 65 2d 3e 63 65  .    pCircle->ce
0ac0: 6e 74 65 72 79 20 3d 20 70 2d 3e 61 50 61 72 61  ntery = p->aPara
0ad0: 6d 5b 31 5d 3b 0a 20 20 20 20 70 43 69 72 63 6c  m[1];.    pCircl
0ae0: 65 2d 3e 72 61 64 69 75 73 20 3d 20 70 2d 3e 61  e->radius = p->a
0af0: 50 61 72 61 6d 5b 32 5d 3b 0a 0a 20 20 20 20 2f  Param[2];..    /
0b00: 2a 20 44 65 66 69 6e 65 20 74 77 6f 20 62 6f 75  * Define two bou
0b10: 6e 64 69 6e 67 20 62 6f 78 20 72 65 67 69 6f 6e  nding box region
0b20: 73 2e 20 54 68 65 20 66 69 72 73 74 2c 20 61 42  s. The first, aB
0b30: 6f 78 5b 30 5d 2c 20 65 78 74 65 6e 64 73 20 74  ox[0], extends t
0b40: 6f 0a 20 20 20 20 2a 2a 20 69 6e 66 69 6e 69 74  o.    ** infinit
0b50: 79 20 69 6e 20 74 68 65 20 58 20 64 69 6d 65 6e  y in the X dimen
0b60: 73 69 6f 6e 2e 20 49 74 20 63 6f 76 65 72 73 20  sion. It covers 
0b70: 74 68 65 20 73 61 6d 65 20 72 61 6e 67 65 20 6f  the same range o
0b80: 66 20 74 68 65 20 59 20 64 69 6d 65 6e 73 69 6f  f the Y dimensio
0b90: 6e 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20  n.    ** as the 
0ba0: 63 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e  circular region.
0bb0: 20 54 68 65 20 73 65 63 6f 6e 64 2c 20 61 42 6f   The second, aBo
0bc0: 78 5b 31 5d 2c 20 65 78 74 65 6e 64 73 20 74 6f  x[1], extends to
0bd0: 20 69 6e 66 69 6e 69 74 79 20 69 6e 0a 20 20 20   infinity in.   
0be0: 20 2a 2a 20 74 68 65 20 59 20 64 69 6d 65 6e 73   ** the Y dimens
0bf0: 69 6f 6e 20 61 6e 64 20 69 73 20 63 6f 6e 73 74  ion and is const
0c00: 72 61 69 6e 65 64 20 74 6f 20 74 68 65 20 72 61  rained to the ra
0c10: 6e 67 65 20 6f 66 20 74 68 65 20 63 69 72 63 6c  nge of the circl
0c20: 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
0c30: 58 20 64 69 6d 65 6e 73 69 6f 6e 2e 0a 20 20 20  X dimension..   
0c40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20   **.    ** Then 
0c50: 69 6d 61 67 69 6e 65 20 65 61 63 68 20 62 6f 78  imagine each box
0c60: 20 69 73 20 73 70 6c 69 74 20 69 6e 20 68 61 6c   is split in hal
0c70: 66 20 61 6c 6f 6e 67 20 69 74 73 20 73 68 6f 72  f along its shor
0c80: 74 20 61 78 69 73 20 62 79 20 61 20 6c 69 6e 65  t axis by a line
0c90: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74  .    ** that int
0ca0: 65 72 73 65 63 74 73 20 74 68 65 20 63 65 6e 74  ersects the cent
0cb0: 65 72 20 6f 66 20 74 68 65 20 63 69 72 63 75 6c  er of the circul
0cc0: 61 72 20 72 65 67 69 6f 6e 2e 20 41 20 62 6f 75  ar region. A bou
0cd0: 6e 64 69 6e 67 20 62 6f 78 0a 20 20 20 20 2a 2a  nding box.    **
0ce0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 63 61   being tested ca
0cf0: 6e 20 62 65 20 73 61 69 64 20 74 6f 20 69 6e 74  n be said to int
0d00: 65 72 73 65 63 74 20 74 68 65 20 63 69 72 63 75  ersect the circu
0d10: 6c 61 72 20 72 65 67 69 6f 6e 20 69 66 20 69 74  lar region if it
0d20: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
0d30: 20 70 6f 69 6e 74 73 20 66 72 6f 6d 20 65 61 63   points from eac
0d40: 68 20 68 61 6c 66 20 6f 66 20 65 69 74 68 65 72  h half of either
0d50: 20 6f 66 20 74 68 65 20 74 77 6f 20 69 6e 66 69   of the two infi
0d60: 6e 69 74 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f  nite bounding bo
0d70: 78 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xes..    */.    
0d80: 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d  pCircle->aBox[0]
0d90: 2e 78 6d 69 6e 20 3d 20 70 43 69 72 63 6c 65 2d  .xmin = pCircle-
0da0: 3e 63 65 6e 74 65 72 78 3b 0a 20 20 20 20 70 43  >centerx;.    pC
0db0: 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 78  ircle->aBox[0].x
0dc0: 6d 61 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63  max = pCircle->c
0dd0: 65 6e 74 65 72 78 3b 0a 20 20 20 20 70 43 69 72  enterx;.    pCir
0de0: 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 69  cle->aBox[0].ymi
0df0: 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  n = pCircle->cen
0e00: 74 65 72 79 20 2b 20 70 43 69 72 63 6c 65 2d 3e  tery + pCircle->
0e10: 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72  radius;.    pCir
0e20: 63 6c 65 2d 3e 61 42 6f 78 5b 30 5d 2e 79 6d 61  cle->aBox[0].yma
0e30: 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  x = pCircle->cen
0e40: 74 65 72 79 20 2d 20 70 43 69 72 63 6c 65 2d 3e  tery - pCircle->
0e50: 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72  radius;.    pCir
0e60: 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 69  cle->aBox[1].xmi
0e70: 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  n = pCircle->cen
0e80: 74 65 72 78 20 2b 20 70 43 69 72 63 6c 65 2d 3e  terx + pCircle->
0e90: 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72  radius;.    pCir
0ea0: 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 78 6d 61  cle->aBox[1].xma
0eb0: 78 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  x = pCircle->cen
0ec0: 74 65 72 78 20 2d 20 70 43 69 72 63 6c 65 2d 3e  terx - pCircle->
0ed0: 72 61 64 69 75 73 3b 0a 20 20 20 20 70 43 69 72  radius;.    pCir
0ee0: 63 6c 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 69  cle->aBox[1].ymi
0ef0: 6e 20 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e  n = pCircle->cen
0f00: 74 65 72 79 3b 0a 20 20 20 20 70 43 69 72 63 6c  tery;.    pCircl
0f10: 65 2d 3e 61 42 6f 78 5b 31 5d 2e 79 6d 61 78 20  e->aBox[1].ymax 
0f20: 3d 20 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65  = pCircle->cente
0f30: 72 79 3b 0a 20 20 7d 0a 0a 20 20 70 43 69 72 63  ry;.  }..  pCirc
0f40: 6c 65 20 3d 20 28 43 69 72 63 6c 65 20 2a 29 70  le = (Circle *)p
0f50: 2d 3e 70 55 73 65 72 3b 0a 20 20 78 6d 69 6e 20  ->pUser;.  xmin 
0f60: 3d 20 61 43 6f 6f 72 64 5b 30 5d 3b 0a 20 20 78  = aCoord[0];.  x
0f70: 6d 61 78 20 3d 20 61 43 6f 6f 72 64 5b 31 5d 3b  max = aCoord[1];
0f80: 0a 20 20 79 6d 69 6e 20 3d 20 61 43 6f 6f 72 64  .  ymin = aCoord
0f90: 5b 32 5d 3b 0a 20 20 79 6d 61 78 20 3d 20 61 43  [2];.  ymax = aC
0fa0: 6f 6f 72 64 5b 33 5d 3b 0a 0a 20 20 2f 2a 20 43  oord[3];..  /* C
0fb0: 68 65 63 6b 20 69 66 20 61 6e 79 20 6f 66 20 74  heck if any of t
0fc0: 68 65 20 34 20 63 6f 72 6e 65 72 73 20 6f 66 20  he 4 corners of 
0fd0: 74 68 65 20 62 6f 75 6e 64 69 6e 67 2d 62 6f 78  the bounding-box
0fe0: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 6c 69   being tested li
0ff0: 65 20 0a 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  e .  ** inside t
1000: 68 65 20 63 69 72 63 75 6c 61 72 20 72 65 67 69  he circular regi
1010: 6f 6e 2e 20 49 66 20 74 68 65 79 20 64 6f 2c 20  on. If they do, 
1020: 74 68 65 6e 20 74 68 65 20 62 6f 75 6e 64 69 6e  then the boundin
1030: 67 2d 62 6f 78 20 64 6f 65 73 0a 20 20 2a 2a 20  g-box does.  ** 
1040: 69 6e 74 65 72 73 65 63 74 20 74 68 65 20 72 65  intersect the re
1050: 67 69 6f 6e 20 6f 66 20 69 6e 74 65 72 65 73 74  gion of interest
1060: 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
1070: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75   variable to tru
1080: 65 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  e and.  ** retur
1090: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6e 20 74  n SQLITE_OK in t
10a0: 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66  his case. */.  f
10b0: 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=0; i<4; i++
10c0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 20  ){.    double x 
10d0: 3d 20 28 69 26 30 78 30 31 29 20 3f 20 78 6d 61  = (i&0x01) ? xma
10e0: 78 20 3a 20 78 6d 69 6e 3b 0a 20 20 20 20 64 6f  x : xmin;.    do
10f0: 75 62 6c 65 20 79 20 3d 20 28 69 26 30 78 30 32  uble y = (i&0x02
1100: 29 20 3f 20 79 6d 61 78 20 3a 20 79 6d 69 6e 3b  ) ? ymax : ymin;
1110: 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 32 3b 0a  .    double d2;.
1120: 20 20 20 20 0a 20 20 20 20 64 32 20 20 3d 20 28      .    d2  = (
1130: 78 2d 70 43 69 72 63 6c 65 2d 3e 63 65 6e 74 65  x-pCircle->cente
1140: 72 78 29 2a 28 78 2d 70 43 69 72 63 6c 65 2d 3e  rx)*(x-pCircle->
1150: 63 65 6e 74 65 72 78 29 3b 0a 20 20 20 20 64 32  centerx);.    d2
1160: 20 2b 3d 20 28 79 2d 70 43 69 72 63 6c 65 2d 3e   += (y-pCircle->
1170: 63 65 6e 74 65 72 79 29 2a 28 79 2d 70 43 69 72  centery)*(y-pCir
1180: 63 6c 65 2d 3e 63 65 6e 74 65 72 79 29 3b 0a 20  cle->centery);. 
1190: 20 20 20 69 66 28 20 64 32 3c 28 70 43 69 72 63     if( d2<(pCirc
11a0: 6c 65 2d 3e 72 61 64 69 75 73 2a 70 43 69 72 63  le->radius*pCirc
11b0: 6c 65 2d 3e 72 61 64 69 75 73 29 20 29 7b 0a 20  le->radius) ){. 
11c0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
11d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11e0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
11f0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1200: 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f   the bounding bo
1210: 78 20 63 6f 76 65 72 73 20 61 6e 79 20 6f 74 68  x covers any oth
1220: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  er part of the c
1230: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 0a  ircular region..
1240: 20 20 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    ** See comment
1250: 73 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65  s above for a de
1260: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77  scription of how
1270: 20 74 68 69 73 20 74 65 73 74 20 77 6f 72 6b 73   this test works
1280: 2e 20 49 66 20 69 74 20 64 6f 65 73 0a 20 20 2a  . If it does.  *
1290: 2a 20 63 6f 76 65 72 20 70 61 72 74 20 6f 66 20  * cover part of 
12a0: 74 68 65 20 63 69 72 63 75 6c 61 72 20 72 65 67  the circular reg
12b0: 69 6f 6e 2c 20 73 65 74 20 74 68 65 20 6f 75 74  ion, set the out
12c0: 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
12d0: 74 72 75 65 0a 20 20 2a 2a 20 61 6e 64 20 72 65  true.  ** and re
12e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12f0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1300: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  2; i++){.    if(
1310: 20 78 6d 69 6e 3c 3d 70 43 69 72 63 6c 65 2d 3e   xmin<=pCircle->
1320: 61 42 6f 78 5b 69 5d 2e 78 6d 69 6e 20 0a 20 20  aBox[i].xmin .  
1330: 20 20 20 26 26 20 78 6d 61 78 3e 3d 70 43 69 72     && xmax>=pCir
1340: 63 6c 65 2d 3e 61 42 6f 78 5b 69 5d 2e 78 6d 61  cle->aBox[i].xma
1350: 78 20 0a 20 20 20 20 20 26 26 20 79 6d 69 6e 3c  x .     && ymin<
1360: 3d 70 43 69 72 63 6c 65 2d 3e 61 42 6f 78 5b 69  =pCircle->aBox[i
1370: 5d 2e 79 6d 69 6e 20 0a 20 20 20 20 20 26 26 20  ].ymin .     && 
1380: 79 6d 61 78 3e 3d 70 43 69 72 63 6c 65 2d 3e 61  ymax>=pCircle->a
1390: 42 6f 78 5b 69 5d 2e 79 6d 61 78 20 0a 20 20 20  Box[i].ymax .   
13a0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
13b0: 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
13c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
13e0: 20 73 70 65 63 69 66 69 65 64 20 62 6f 75 6e 64   specified bound
13f0: 69 6e 67 20 62 6f 78 20 64 6f 65 73 20 6e 6f 74  ing box does not
1400: 20 69 6e 74 65 72 73 65 63 74 20 74 68 65 20 63   intersect the c
1410: 69 72 63 75 6c 61 72 20 72 65 67 69 6f 6e 2e 20  ircular region. 
1420: 53 65 74 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  Set.  ** the out
1430: 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1440: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1450: 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20  SQLITE_OK. */.  
1460: 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1480: 0a 0a 2f 2a 20 45 4e 44 20 6f 66 20 69 6d 70 6c  ../* END of impl
1490: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 63  ementation of "c
14a0: 69 72 63 6c 65 22 20 67 65 6f 6d 65 74 72 79 20  ircle" geometry 
14b0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 2a 2a 2a 2a  callback..******
14c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1500: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1550: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
1560: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 74  t.h>.#include "t
1570: 63 6c 2e 68 22 0a 0a 74 79 70 65 64 65 66 20 73  cl.h"..typedef s
1580: 74 72 75 63 74 20 43 75 62 65 20 43 75 62 65 3b  truct Cube Cube;
1590: 0a 73 74 72 75 63 74 20 43 75 62 65 20 7b 0a 20  .struct Cube {. 
15a0: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 64 6f 75   double x;.  dou
15b0: 62 6c 65 20 79 3b 0a 20 20 64 6f 75 62 6c 65 20  ble y;.  double 
15c0: 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 77 69 64 74  z;.  double widt
15d0: 68 3b 0a 20 20 64 6f 75 62 6c 65 20 68 65 69 67  h;.  double heig
15e0: 68 74 3b 0a 20 20 64 6f 75 62 6c 65 20 64 65 70  ht;.  double dep
15f0: 74 68 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76  th;.};..static v
1600: 6f 69 64 20 63 75 62 65 5f 63 6f 6e 74 65 78 74  oid cube_context
1610: 5f 66 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a  _free(void *p){.
1620: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
1640: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20  context pointer 
1650: 72 65 67 69 73 74 65 72 65 64 20 61 6c 6f 6e 67  registered along
1660: 20 77 69 74 68 20 74 68 65 20 27 63 75 62 65 27   with the 'cube'
1670: 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20   callback is.** 
1680: 61 6c 77 61 79 73 20 28 28 76 6f 69 64 20 2a 29  always ((void *)
1690: 26 67 48 65 72 65 29 2e 20 54 68 69 73 20 69 73  &gHere). This is
16a0: 20 6a 75 73 74 20 74 6f 20 66 61 63 69 6c 69 74   just to facilit
16b0: 61 74 65 20 74 65 73 74 69 6e 67 2c 20 69 74 20  ate testing, it 
16c0: 69 73 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  is not.** actual
16d0: 6c 79 20 75 73 65 64 20 66 6f 72 20 61 6e 79 74  ly used for anyt
16e0: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
16f0: 69 6e 74 20 67 48 65 72 65 20 3d 20 34 32 3b 0a  int gHere = 42;.
1700: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1710: 61 74 69 6f 6e 20 6f 66 20 61 20 73 69 6d 70 6c  ation of a simpl
1720: 65 20 72 2d 74 72 65 65 20 67 65 6f 6d 20 63 61  e r-tree geom ca
1730: 6c 6c 62 61 63 6b 20 74 6f 20 74 65 73 74 20 66  llback to test f
1740: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 0a  or intersection.
1750: 2a 2a 20 6f 66 20 72 2d 74 72 65 65 20 72 6f 77  ** of r-tree row
1760: 73 20 77 69 74 68 20 61 20 22 63 75 62 65 22 20  s with a "cube" 
1770: 73 68 61 70 65 2e 20 43 75 62 65 73 20 61 72 65  shape. Cubes are
1780: 20 64 65 66 69 6e 65 64 20 62 79 20 73 69 78 20   defined by six 
1790: 73 63 61 6c 61 72 0a 2a 2a 20 63 6f 6f 72 64 69  scalar.** coordi
17a0: 6e 61 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73  nates as follows
17b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 63 75 62 65 28 78  :.**.**   cube(x
17c0: 2c 20 79 2c 20 7a 2c 20 77 69 64 74 68 2c 20 68  , y, z, width, h
17d0: 65 69 67 68 74 2c 20 64 65 70 74 68 29 0a 2a 2a  eight, depth).**
17e0: 0a 2a 2a 20 54 68 65 20 77 69 64 74 68 2c 20 68  .** The width, h
17f0: 65 69 67 68 74 20 61 6e 64 20 64 65 70 74 68 20  eight and depth 
1800: 70 61 72 61 6d 65 74 65 72 73 20 6d 75 73 74 20  parameters must 
1810: 61 6c 6c 20 62 65 20 67 72 65 61 74 65 72 20 74  all be greater t
1820: 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  han zero..*/.sta
1830: 74 69 63 20 69 6e 74 20 63 75 62 65 5f 67 65 6f  tic int cube_geo
1840: 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72  m(.  sqlite3_rtr
1850: 65 65 5f 67 65 6f 6d 65 74 72 79 20 2a 70 2c 0a  ee_geometry *p,.
1860: 20 20 69 6e 74 20 6e 43 6f 6f 72 64 2c 0a 23 69    int nCoord,.#i
1870: 66 64 65 66 20 53 51 4c 49 54 45 5f 52 54 52 45  fdef SQLITE_RTRE
1880: 45 5f 49 4e 54 5f 4f 4e 4c 59 0a 20 20 73 71 6c  E_INT_ONLY.  sql
1890: 69 74 65 33 5f 69 6e 74 36 34 20 2a 61 43 6f 6f  ite3_int64 *aCoo
18a0: 72 64 2c 20 0a 23 65 6c 73 65 0a 20 20 64 6f 75  rd, .#else.  dou
18b0: 62 6c 65 20 2a 61 43 6f 6f 72 64 2c 20 0a 23 65  ble *aCoord, .#e
18c0: 6e 64 69 66 0a 20 20 69 6e 74 20 2a 70 69 52 65  ndif.  int *piRe
18d0: 73 0a 29 7b 0a 20 20 43 75 62 65 20 2a 70 43 75  s.){.  Cube *pCu
18e0: 62 65 20 3d 20 28 43 75 62 65 20 2a 29 70 2d 3e  be = (Cube *)p->
18f0: 70 55 73 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pUser;..  assert
1900: 28 20 70 2d 3e 70 43 6f 6e 74 65 78 74 3d 3d 28  ( p->pContext==(
1910: 76 6f 69 64 20 2a 29 26 67 48 65 72 65 20 29 3b  void *)&gHere );
1920: 0a 0a 20 20 69 66 28 20 70 43 75 62 65 3d 3d 30  ..  if( pCube==0
1930: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
1940: 50 61 72 61 6d 21 3d 36 20 7c 7c 20 6e 43 6f 6f  Param!=6 || nCoo
1950: 72 64 21 3d 36 0a 20 20 20 20 20 7c 7c 20 70 2d  rd!=6.     || p-
1960: 3e 61 50 61 72 61 6d 5b 33 5d 3c 3d 30 2e 30 20  >aParam[3]<=0.0 
1970: 7c 7c 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3c  || p->aParam[4]<
1980: 3d 30 2e 30 20 7c 7c 20 70 2d 3e 61 50 61 72 61  =0.0 || p->aPara
1990: 6d 5b 35 5d 3c 3d 30 2e 30 0a 20 20 20 20 29 7b  m[5]<=0.0.    ){
19a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
19c0: 7d 0a 20 20 20 20 70 43 75 62 65 20 3d 20 28 43  }.    pCube = (C
19d0: 75 62 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ube *)sqlite3_ma
19e0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 75 62 65  lloc(sizeof(Cube
19f0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 75  ));.    if( !pCu
1a00: 62 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  be ){.      retu
1a10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1a20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 62 65  .    }.    pCube
1a30: 2d 3e 78 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b  ->x = p->aParam[
1a40: 30 5d 3b 0a 20 20 20 20 70 43 75 62 65 2d 3e 79  0];.    pCube->y
1a50: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 31 5d 3b   = p->aParam[1];
1a60: 0a 20 20 20 20 70 43 75 62 65 2d 3e 7a 20 3d 20  .    pCube->z = 
1a70: 70 2d 3e 61 50 61 72 61 6d 5b 32 5d 3b 0a 20 20  p->aParam[2];.  
1a80: 20 20 70 43 75 62 65 2d 3e 77 69 64 74 68 20 3d    pCube->width =
1a90: 20 70 2d 3e 61 50 61 72 61 6d 5b 33 5d 3b 0a 20   p->aParam[3];. 
1aa0: 20 20 20 70 43 75 62 65 2d 3e 68 65 69 67 68 74     pCube->height
1ab0: 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 34 5d 3b   = p->aParam[4];
1ac0: 0a 20 20 20 20 70 43 75 62 65 2d 3e 64 65 70 74  .    pCube->dept
1ad0: 68 20 3d 20 70 2d 3e 61 50 61 72 61 6d 5b 35 5d  h = p->aParam[5]
1ae0: 3b 0a 0a 20 20 20 20 70 2d 3e 70 55 73 65 72 20  ;..    p->pUser 
1af0: 3d 20 28 76 6f 69 64 20 2a 29 70 43 75 62 65 3b  = (void *)pCube;
1b00: 0a 20 20 20 20 70 2d 3e 78 44 65 6c 55 73 65 72  .    p->xDelUser
1b10: 20 3d 20 63 75 62 65 5f 63 6f 6e 74 65 78 74 5f   = cube_context_
1b20: 66 72 65 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  free;.  }..  ass
1b30: 65 72 74 28 20 6e 43 6f 6f 72 64 3d 3d 36 20 29  ert( nCoord==6 )
1b40: 3b 0a 20 20 2a 70 69 52 65 73 20 3d 20 30 3b 0a  ;.  *piRes = 0;.
1b50: 20 20 69 66 28 20 61 43 6f 6f 72 64 5b 30 5d 3c    if( aCoord[0]<
1b60: 3d 28 70 43 75 62 65 2d 3e 78 2b 70 43 75 62 65  =(pCube->x+pCube
1b70: 2d 3e 77 69 64 74 68 29 0a 20 20 20 26 26 20 61  ->width).   && a
1b80: 43 6f 6f 72 64 5b 31 5d 3e 3d 70 43 75 62 65 2d  Coord[1]>=pCube-
1b90: 3e 78 0a 20 20 20 26 26 20 61 43 6f 6f 72 64 5b  >x.   && aCoord[
1ba0: 32 5d 3c 3d 28 70 43 75 62 65 2d 3e 79 2b 70 43  2]<=(pCube->y+pC
1bb0: 75 62 65 2d 3e 68 65 69 67 68 74 29 0a 20 20 20  ube->height).   
1bc0: 26 26 20 61 43 6f 6f 72 64 5b 33 5d 3e 3d 70 43  && aCoord[3]>=pC
1bd0: 75 62 65 2d 3e 79 0a 20 20 20 26 26 20 61 43 6f  ube->y.   && aCo
1be0: 6f 72 64 5b 34 5d 3c 3d 28 70 43 75 62 65 2d 3e  ord[4]<=(pCube->
1bf0: 7a 2b 70 43 75 62 65 2d 3e 64 65 70 74 68 29 0a  z+pCube->depth).
1c00: 20 20 20 26 26 20 61 43 6f 6f 72 64 5b 35 5d 3e     && aCoord[5]>
1c10: 3d 70 43 75 62 65 2d 3e 7a 0a 20 20 29 7b 0a 20  =pCube->z.  ){. 
1c20: 20 20 20 2a 70 69 52 65 73 20 3d 20 31 3b 0a 20     *piRes = 1;. 
1c30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1c40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1c50: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1c60: 45 5f 52 54 52 45 45 20 2a 2f 0a 0a 73 74 61 74  E_RTREE */..stat
1c70: 69 63 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f  ic int register_
1c80: 63 75 62 65 5f 67 65 6f 6d 28 0a 20 20 76 6f 69  cube_geom(.  voi
1c90: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ca0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cb0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cc0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cd0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
1cf0: 4c 45 5f 52 54 52 45 45 0a 20 20 55 4e 55 53 45  LE_RTREE.  UNUSE
1d00: 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65  D_PARAMETER(clie
1d10: 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45  ntData);.  UNUSE
1d20: 44 5f 50 41 52 41 4d 45 54 45 52 28 69 6e 74 65  D_PARAMETER(inte
1d30: 72 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rp);.  UNUSED_PA
1d40: 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 20  RAMETER(objc);. 
1d50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d60: 52 28 6f 62 6a 76 29 3b 0a 23 65 6c 73 65 0a 20  R(objv);.#else. 
1d70: 20 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44   extern int getD
1d80: 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
1d90: 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  erp*, const char
1da0: 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20  *, sqlite3**);. 
1db0: 20 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68   extern const ch
1dc0: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
1dd0: 6d 65 28 69 6e 74 29 3b 0a 20 20 73 71 6c 69 74  me(int);.  sqlit
1de0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1df0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1e00: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1e10: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1e20: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1e30: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e50: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e60: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1e70: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1e80: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e90: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1ea0: 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
1eb0: 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b 28 64 62  etry_callback(db
1ec0: 2c 20 22 63 75 62 65 22 2c 20 63 75 62 65 5f 67  , "cube", cube_g
1ed0: 65 6f 6d 2c 20 28 76 6f 69 64 20 2a 29 26 67 48  eom, (void *)&gH
1ee0: 65 72 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  ere);.  Tcl_SetR
1ef0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1f00: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
1f10: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1f20: 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ATIC);.#endif.  
1f30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67  ..static int reg
1f50: 69 73 74 65 72 5f 63 69 72 63 6c 65 5f 67 65 6f  ister_circle_geo
1f60: 6d 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  m(.  void * clie
1f70: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f90: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1fa0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1fb0: 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1fc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
1fd0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1fe0: 54 45 52 28 63 6c 69 65 6e 74 44 61 74 61 29 3b  TER(clientData);
1ff0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2000: 54 45 52 28 69 6e 74 65 72 70 29 3b 0a 20 20 55  TER(interp);.  U
2010: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2020: 6f 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  objc);.  UNUSED_
2030: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b  PARAMETER(objv);
2040: 0a 23 65 6c 73 65 0a 20 20 65 78 74 65 72 6e 20  .#else.  extern 
2050: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
2060: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f  (Tcl_Interp*, co
2070: 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74  nst char*, sqlit
2080: 65 33 2a 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  e3**);.  extern 
2090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
20a0: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b  te3ErrName(int);
20b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20c0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
20d0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2100: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
2110: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2120: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2130: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2140: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2150: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
2160: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2170: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 74   rc = sqlite3_rt
2180: 72 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c  ree_geometry_cal
2190: 6c 62 61 63 6b 28 64 62 2c 20 22 63 69 72 63 6c  lback(db, "circl
21a0: 65 22 2c 20 63 69 72 63 6c 65 5f 67 65 6f 6d 2c  e", circle_geom,
21b0: 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
21c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
21d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
21e0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
21f0: 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
2200: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2210: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72  .int Sqlitetestr
2220: 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tree_Init(Tcl_In
2230: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
2240: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
2250: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 72  mmand(interp, "r
2260: 65 67 69 73 74 65 72 5f 63 75 62 65 5f 67 65 6f  egister_cube_geo
2270: 6d 22 2c 20 72 65 67 69 73 74 65 72 5f 63 75 62  m", register_cub
2280: 65 5f 67 65 6f 6d 2c 20 30 2c 20 30 29 3b 0a 20  e_geom, 0, 0);. 
2290: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
22a0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 72  mmand(interp, "r
22b0: 65 67 69 73 74 65 72 5f 63 69 72 63 6c 65 5f 67  egister_circle_g
22c0: 65 6f 6d 22 2c 72 65 67 69 73 74 65 72 5f 63 69  eom",register_ci
22d0: 72 63 6c 65 5f 67 65 6f 6d 2c 30 2c 30 29 3b 0a  rcle_geom,0,0);.
22e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
22f0: 0a 7d 0a                                         .}.