/ Hex Artifact Content
Login

Artifact 9d8411b2bcaab719f65acc8a84d16200d5139ac634787df546c31bf9972b34e6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 35 2d 32 35  /*.** 2018-05-25
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 52  an alternative R
01a0: 2d 54 72 65 65 20 76 69 72 74 75 61 6c 20 74 61  -Tree virtual ta
01b0: 62 6c 65 20 74 68 61 74 0a 2a 2a 20 75 73 65 73  ble that.** uses
01c0: 20 70 6f 6c 79 67 6f 6e 73 20 74 6f 20 65 78 70   polygons to exp
01d0: 72 65 73 73 20 74 68 65 20 62 6f 75 6e 64 61 72  ress the boundar
01e0: 69 65 73 20 6f 66 20 32 2d 64 69 6d 65 6e 73 69  ies of 2-dimensi
01f0: 6f 6e 61 6c 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  onal objects..**
0200: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73  .** This file is
0210: 20 23 69 6e 63 6c 75 64 65 2d 65 64 20 6f 6e 74   #include-ed ont
0220: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 22 72 74  o the end of "rt
0230: 72 65 65 2e 63 22 20 73 6f 20 74 68 61 74 20 69  ree.c" so that i
0240: 74 20 68 61 73 0a 2a 2a 20 61 63 63 65 73 73 20  t has.** access 
0250: 74 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 52 2d  to all of the R-
0260: 54 72 65 65 20 69 6e 74 65 72 6e 61 6c 73 2e 0a  Tree internals..
0270: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
0280: 6c 69 62 2e 68 3e 0a 0a 2f 2a 20 45 6e 61 62 6c  lib.h>../* Enabl
0290: 65 20 2d 44 47 45 4f 50 4f 4c 59 5f 45 4e 41 42  e -DGEOPOLY_ENAB
02a0: 4c 45 5f 44 45 42 55 47 20 66 6f 72 20 64 65 62  LE_DEBUG for deb
02b0: 75 67 67 69 6e 67 20 66 61 63 69 6c 69 74 69 65  ugging facilitie
02c0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 47 45 4f 50  s */.#ifdef GEOP
02d0: 4f 4c 59 5f 45 4e 41 42 4c 45 5f 44 45 42 55 47  OLY_ENABLE_DEBUG
02e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 67 65  .  static int ge
02f0: 6f 5f 64 65 62 75 67 20 3d 20 30 3b 0a 23 20 64  o_debug = 0;.# d
0300: 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28 58  efine GEODEBUG(X
0310: 29 20 69 66 28 67 65 6f 5f 64 65 62 75 67 29 70  ) if(geo_debug)p
0320: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0330: 64 65 66 69 6e 65 20 47 45 4f 44 45 42 55 47 28  define GEODEBUG(
0340: 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  X).#endif..#ifnd
0350: 65 66 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20 20 2f  ef JSON_NULL   /
0360: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0370: 73 74 75 66 66 20 72 65 70 65 61 74 73 20 74 68  stuff repeats th
0380: 69 6e 67 73 20 66 6f 75 6e 64 20 69 6e 20 6a 73  ings found in js
0390: 6f 6e 31 20 2a 2f 0a 2f 2a 0a 2a 2a 20 56 65 72  on1 */./*.** Ver
03a0: 73 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65  sions of isspace
03b0: 28 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e  (), isalnum() an
03c0: 64 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77  d isdigit() to w
03d0: 68 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a  hich it is safe.
03e0: 2a 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65  ** to pass signe
03f0: 64 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a  d char values..*
0400: 2f 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33  /.#ifdef sqlite3
0410: 49 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73  Isdigit.   /* Us
0420: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
0430: 65 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68  e versions if th
0440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
0450: 72 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20  rt of the.   ** 
0460: 53 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74  SQLite amalgamat
0470: 69 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ion */.#  define
0480: 20 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29   safe_isdigit(x)
0490: 20 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74    sqlite3Isdigit
04a0: 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61  (x).#  define sa
04b0: 66 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73  fe_isalnum(x)  s
04c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29  qlite3Isalnum(x)
04d0: 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f  .#  define safe_
04e0: 69 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69  isxdigit(x) sqli
04f0: 74 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23  te3Isxdigit(x).#
0500: 65 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74  else.   /* Use t
0510: 68 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72  he standard libr
0520: 61 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65  ary for separate
0530: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a   compilation */.
0540: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0550: 68 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  h>  /* amalgamat
0560: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64  or: keep */.#  d
0570: 65 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67  efine safe_isdig
0580: 69 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28  it(x)  isdigit((
0590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78  unsigned char)(x
05a0: 29 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  )).#  define saf
05b0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73  e_isalnum(x)  is
05c0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
05d0: 63 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66  char)(x)).#  def
05e0: 69 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69  ine safe_isxdigi
05f0: 74 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75  t(x) isxdigit((u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0610: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
0620: 47 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20  Growing our own 
0630: 69 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e  isspace() routin
0640: 65 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77  e this way is tw
0650: 69 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a  ice as fast as.*
0660: 2a 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  * the library is
0670: 73 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  space() function
0680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0690: 74 20 63 68 61 72 20 67 65 6f 70 6f 6c 79 49 73  t char geopolyIs
06a0: 53 70 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 30 2c  Space[] = {.  0,
06b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06c0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 31 2c 20  0, 0,     0, 1, 
06d0: 31 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 30  1, 0, 0, 1, 0, 0
06e0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
06f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
0700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0710: 2c 20 30 2c 20 30 2c 0a 20 20 31 2c 20 30 2c 20  , 0, 0,.  1, 0, 
0720: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0730: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0750: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0760: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0780: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0790: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
07a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
07b0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
07c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07d0: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
07e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
07f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0800: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
0810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0820: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
0830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0840: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0850: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
0860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0870: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0890: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
08a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
08b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08c0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
08d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08e0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
08f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0930: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0950: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
09a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 7d 3b 0a 23  0, 0, 0, 0,.};.#
0a10: 64 65 66 69 6e 65 20 73 61 66 65 5f 69 73 73 70  define safe_issp
0a20: 61 63 65 28 78 29 20 28 67 65 6f 70 6f 6c 79 49  ace(x) (geopolyI
0a30: 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e 65 64  sSpace[(unsigned
0a40: 20 63 68 61 72 29 78 5d 29 0a 23 65 6e 64 69 66   char)x]).#endif
0a50: 20 2f 2a 20 4a 53 4f 4e 20 4e 55 4c 4c 20 2d 20   /* JSON NULL - 
0a60: 62 61 63 6b 20 74 6f 20 6f 72 69 67 69 6e 61 6c  back to original
0a70: 20 63 6f 64 65 20 2a 2f 0a 0a 2f 2a 20 43 6f 6d   code */../* Com
0a80: 70 69 6c 65 72 20 61 6e 64 20 76 65 72 73 69 6f  piler and versio
0a90: 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 47 43 43  n */.#ifndef GCC
0aa0: 5f 56 45 52 53 49 4f 4e 0a 23 69 66 20 64 65 66  _VERSION.#if def
0ab0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 26  ined(__GNUC__) &
0ac0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
0ad0: 45 5f 44 49 53 41 42 4c 45 5f 49 4e 54 52 49 4e  E_DISABLE_INTRIN
0ae0: 53 49 43 29 0a 23 20 64 65 66 69 6e 65 20 47 43  SIC).# define GC
0af0: 43 5f 56 45 52 53 49 4f 4e 20 28 5f 5f 47 4e 55  C_VERSION (__GNU
0b00: 43 5f 5f 2a 31 30 30 30 30 30 30 2b 5f 5f 47 4e  C__*1000000+__GN
0b10: 55 43 5f 4d 49 4e 4f 52 5f 5f 2a 31 30 30 30 2b  UC_MINOR__*1000+
0b20: 5f 5f 47 4e 55 43 5f 50 41 54 43 48 4c 45 56 45  __GNUC_PATCHLEVE
0b30: 4c 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  L__).#else.# def
0b40: 69 6e 65 20 47 43 43 5f 56 45 52 53 49 4f 4e 20  ine GCC_VERSION 
0b50: 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  0.#endif.#endif.
0b60: 23 69 66 6e 64 65 66 20 4d 53 56 43 5f 56 45 52  #ifndef MSVC_VER
0b70: 53 49 4f 4e 0a 23 69 66 20 64 65 66 69 6e 65 64  SION.#if defined
0b80: 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 21 64  (_MSC_VER) && !d
0b90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49  efined(SQLITE_DI
0ba0: 53 41 42 4c 45 5f 49 4e 54 52 49 4e 53 49 43 29  SABLE_INTRINSIC)
0bb0: 0a 23 20 64 65 66 69 6e 65 20 4d 53 56 43 5f 56  .# define MSVC_V
0bc0: 45 52 53 49 4f 4e 20 5f 4d 53 43 5f 56 45 52 0a  ERSION _MSC_VER.
0bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
0be0: 53 56 43 5f 56 45 52 53 49 4f 4e 20 30 0a 23 65  SVC_VERSION 0.#e
0bf0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0c00: 44 61 74 61 74 79 70 65 20 66 6f 72 20 63 6f 6f  Datatype for coo
0c10: 72 64 69 6e 61 74 65 73 0a 2a 2f 0a 74 79 70 65  rdinates.*/.type
0c20: 64 65 66 20 66 6c 6f 61 74 20 47 65 6f 43 6f 6f  def float GeoCoo
0c30: 72 64 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  rd;../*.** Inter
0c40: 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
0c50: 6f 6e 20 6f 66 20 61 20 70 6f 6c 79 67 6f 6e 2e  on of a polygon.
0c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 6c 79 67  .**.** The polyg
0c70: 6f 6e 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  on consists of a
0c80: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 76 65 72   sequence of ver
0c90: 74 65 78 65 73 2e 20 20 54 68 65 72 65 20 69 73  texes.  There is
0ca0: 20 61 20 6c 69 6e 65 0a 2a 2a 20 73 65 67 6d 65   a line.** segme
0cb0: 6e 74 20 62 65 74 77 65 65 6e 20 65 61 63 68 20  nt between each 
0cc0: 70 61 69 72 20 6f 66 20 76 65 72 74 65 78 65 73  pair of vertexes
0cd0: 2c 20 61 6e 64 20 6f 6e 65 20 66 69 6e 61 6c 20  , and one final 
0ce0: 73 65 67 6d 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20  segment from.** 
0cf0: 74 68 65 20 6c 61 73 74 20 76 65 72 74 65 78 20  the last vertex 
0d00: 62 61 63 6b 20 74 6f 20 74 68 65 20 66 69 72 73  back to the firs
0d10: 74 2e 20 20 28 54 68 69 73 20 64 69 66 66 65 72  t.  (This differ
0d20: 73 20 66 72 6f 6d 20 74 68 65 20 47 65 6f 4a 53  s from the GeoJS
0d30: 4f 4e 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  ON.** standard i
0d40: 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  n which the fina
0d50: 6c 20 76 65 72 74 65 78 20 69 73 20 61 20 72 65  l vertex is a re
0d60: 70 65 61 74 20 6f 66 20 74 68 65 20 66 69 72 73  peat of the firs
0d70: 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  t.).**.** The po
0d80: 6c 79 67 6f 6e 20 66 6f 6c 6c 6f 77 73 20 74 68  lygon follows th
0d90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 72 75 6c  e right-hand rul
0da0: 65 2e 20 20 54 68 65 20 61 72 65 61 20 74 6f 20  e.  The area to 
0db0: 74 68 65 20 72 69 67 68 74 20 6f 66 0a 2a 2a 20  the right of.** 
0dc0: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73 20  each segment is 
0dd0: 22 6f 75 74 73 69 64 65 22 20 61 6e 64 20 74 68  "outside" and th
0de0: 65 20 61 72 65 61 20 74 6f 20 74 68 65 20 6c 65  e area to the le
0df0: 66 74 20 69 73 20 22 69 6e 73 69 64 65 22 2e 0a  ft is "inside"..
0e00: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 2d 64 69 73  **.** The on-dis
0e10: 6b 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  k representation
0e20: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
0e30: 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 6f 6c  -byte header fol
0e40: 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  lowed by.** the 
0e50: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 34 2d 62  values.  The 4-b
0e60: 79 74 65 20 68 65 61 64 65 72 20 69 73 3a 0a 2a  yte header is:.*
0e70: 2a 0a 2a 2a 20 20 20 20 20 20 65 6e 63 6f 64 69  *.**      encodi
0e80: 6e 67 20 20 20 20 28 31 20 62 79 74 65 29 20 20  ng    (1 byte)  
0e90: 20 30 3d 62 69 67 2d 65 6e 64 69 61 6e 2c 20 31   0=big-endian, 1
0ea0: 3d 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 0a 2a  =little-endian.*
0eb0: 2a 20 20 20 20 20 20 6e 76 65 72 74 65 78 20 20  *      nvertex  
0ec0: 20 20 20 28 33 20 62 79 74 65 73 29 20 20 4e 75     (3 bytes)  Nu
0ed0: 6d 62 65 72 20 6f 66 20 76 65 72 74 65 78 65 73  mber of vertexes
0ee0: 20 61 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   as a big-endian
0ef0: 20 69 6e 74 65 67 65 72 0a 2a 2a 0a 2a 2a 20 45   integer.**.** E
0f00: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 73 20 61  nough space is a
0f10: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 34 20 63  llocated for 4 c
0f20: 6f 6f 72 64 69 6e 61 74 65 73 2c 20 74 6f 20 77  oordinates, to w
0f30: 6f 72 6b 20 61 72 6f 75 6e 64 20 6f 76 65 72 2d  ork around over-
0f40: 7a 65 61 6c 6f 75 73 0a 2a 2a 20 77 61 72 6e 69  zealous.** warni
0f50: 6e 67 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  ngs coming from 
0f60: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 20 28 6e  some compiler (n
0f70: 6f 74 61 62 6c 79 2c 20 63 6c 61 6e 67 29 2e 20  otably, clang). 
0f80: 49 6e 20 72 65 61 6c 69 74 79 2c 20 74 68 65 20  In reality, the 
0f90: 73 69 7a 65 0a 2a 2a 20 6f 66 20 65 61 63 68 20  size.** of each 
0fa0: 47 65 6f 50 6f 6c 79 20 6d 65 6d 6f 72 79 20 61  GeoPoly memory a
0fb0: 6c 6c 6f 63 61 74 65 20 69 73 20 61 64 6a 75 73  llocate is adjus
0fc0: 74 65 64 20 61 73 20 6e 65 63 65 73 73 61 72 79  ted as necessary
0fd0: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
0fe0: 47 65 6f 50 6f 6c 79 2e 61 5b 5d 20 61 72 72 61  GeoPoly.a[] arra
0ff0: 79 20 61 74 20 74 68 65 20 65 6e 64 20 69 73 20  y at the end is 
1000: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1010: 73 69 7a 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  size..*/.typedef
1020: 20 73 74 72 75 63 74 20 47 65 6f 50 6f 6c 79 20   struct GeoPoly 
1030: 47 65 6f 50 6f 6c 79 3b 0a 73 74 72 75 63 74 20  GeoPoly;.struct 
1040: 47 65 6f 50 6f 6c 79 20 7b 0a 20 20 69 6e 74 20  GeoPoly {.  int 
1050: 6e 56 65 72 74 65 78 3b 20 20 20 20 20 20 20 20  nVertex;        
1060: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
1070: 65 72 74 65 78 65 73 20 2a 2f 0a 20 20 75 6e 73  ertexes */.  uns
1080: 69 67 6e 65 64 20 63 68 61 72 20 68 64 72 5b 34  igned char hdr[4
1090: 5d 3b 20 2f 2a 20 48 65 61 64 65 72 20 66 6f 72  ]; /* Header for
10a0: 20 6f 6e 2d 64 69 73 6b 20 72 65 70 72 65 73 65   on-disk represe
10b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 47 65 6f  ntation */.  Geo
10c0: 43 6f 6f 72 64 20 61 5b 38 5d 3b 20 20 20 20 20  Coord a[8];     
10d0: 20 20 20 2f 2a 20 32 2a 6e 56 65 72 74 65 78 20     /* 2*nVertex 
10e0: 76 61 6c 75 65 73 2e 20 58 20 28 6c 6f 6e 67 69  values. X (longi
10f0: 74 75 64 65 29 20 66 69 72 73 74 2c 20 74 68 65  tude) first, the
1100: 6e 20 59 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  n Y */.};../* Th
1110: 65 20 73 69 7a 65 20 6f 66 20 61 20 6d 65 6d 6f  e size of a memo
1120: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65  ry allocation ne
1130: 65 64 65 64 20 66 6f 72 20 61 20 47 65 6f 50 6f  eded for a GeoPo
1140: 6c 79 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  ly object suffic
1150: 69 65 6e 74 0a 2a 2a 20 74 6f 20 68 6f 6c 64 20  ient.** to hold 
1160: 4e 20 63 6f 6f 72 64 69 6e 61 74 65 20 70 61 69  N coordinate pai
1170: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  rs..*/.#define G
1180: 45 4f 50 4f 4c 59 5f 53 5a 28 4e 29 20 20 28 73  EOPOLY_SZ(N)  (s
1190: 69 7a 65 6f 66 28 47 65 6f 50 6f 6c 79 29 20 2b  izeof(GeoPoly) +
11a0: 20 73 69 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64   sizeof(GeoCoord
11b0: 29 2a 32 2a 28 28 4e 29 2d 34 29 29 0a 0a 2f 2a  )*2*((N)-4))../*
11c0: 0a 2a 2a 20 53 74 61 74 65 20 6f 66 20 61 20 70  .** State of a p
11d0: 61 72 73 65 20 6f 66 20 61 20 47 65 6f 4a 53 4f  arse of a GeoJSO
11e0: 4e 20 69 6e 70 75 74 2e 0a 2a 2f 0a 74 79 70 65  N input..*/.type
11f0: 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 50 61  def struct GeoPa
1200: 72 73 65 20 47 65 6f 50 61 72 73 65 3b 0a 73 74  rse GeoParse;.st
1210: 72 75 63 74 20 47 65 6f 50 61 72 73 65 20 7b 0a  ruct GeoParse {.
1220: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1230: 20 63 68 61 72 20 2a 7a 3b 20 20 20 2f 2a 20 55   char *z;   /* U
1240: 6e 70 61 72 73 65 64 20 69 6e 70 75 74 20 2a 2f  nparsed input */
1250: 0a 20 20 69 6e 74 20 6e 56 65 72 74 65 78 3b 20  .  int nVertex; 
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1270: 4e 75 6d 62 65 72 20 6f 66 20 76 65 72 74 65 78  Number of vertex
1280: 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69  es in a[] */.  i
1290: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nt nAlloc;      
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
12b0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61  e allocated to a
12c0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  [] */.  int nErr
12d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
12f0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
1300: 64 20 2a 2f 0a 20 20 47 65 6f 43 6f 6f 72 64 20  d */.  GeoCoord 
1310: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *a;          /* 
1320: 41 72 72 61 79 20 6f 66 20 76 65 72 74 65 78 65  Array of vertexe
1330: 73 2e 20 20 46 72 6f 6d 20 73 71 6c 69 74 65 33  s.  From sqlite3
1340: 5f 6d 61 6c 6c 6f 63 36 34 28 29 20 2a 2f 0a 7d  _malloc64() */.}
1350: 3b 0a 0a 2f 2a 20 44 6f 20 61 20 34 2d 62 79 74  ;../* Do a 4-byt
1360: 65 20 62 79 74 65 20 73 77 61 70 20 2a 2f 0a 73  e byte swap */.s
1370: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f  tatic void geopo
1380: 6c 79 53 77 61 62 33 32 28 75 6e 73 69 67 6e 65  lySwab32(unsigne
1390: 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 75 6e  d char *a){.  un
13a0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 20 3d 20  signed char t = 
13b0: 61 5b 30 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 61  a[0];.  a[0] = a
13c0: 5b 33 5d 3b 0a 20 20 61 5b 33 5d 20 3d 20 74 3b  [3];.  a[3] = t;
13d0: 0a 20 20 74 20 3d 20 61 5b 31 5d 3b 0a 20 20 61  .  t = a[1];.  a
13e0: 5b 31 5d 20 3d 20 61 5b 32 5d 3b 0a 20 20 61 5b  [1] = a[2];.  a[
13f0: 32 5d 20 3d 20 74 3b 0a 7d 0a 0a 2f 2a 20 53 6b  2] = t;.}../* Sk
1400: 69 70 20 77 68 69 74 65 73 70 61 63 65 2e 20 20  ip whitespace.  
1410: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
1420: 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63  non-whitespace c
1430: 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 73 74 61  haracter. */.sta
1440: 74 69 63 20 63 68 61 72 20 67 65 6f 70 6f 6c 79  tic char geopoly
1450: 53 6b 69 70 53 70 61 63 65 28 47 65 6f 50 61 72  SkipSpace(GeoPar
1460: 73 65 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  se *p){.  while(
1470: 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 70 2d   safe_isspace(p-
1480: 3e 7a 5b 30 5d 29 20 29 20 70 2d 3e 7a 2b 2b 3b  >z[0]) ) p->z++;
1490: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 5b 30  .  return p->z[0
14a0: 5d 3b 0a 7d 0a 0a 2f 2a 20 50 61 72 73 65 20 6f  ];.}../* Parse o
14b0: 75 74 20 61 20 6e 75 6d 62 65 72 2e 20 20 57 72  ut a number.  Wr
14c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ite the value in
14d0: 74 6f 20 2a 70 56 61 6c 20 69 66 20 70 56 61 6c  to *pVal if pVal
14e0: 21 3d 30 2e 0a 2a 2a 20 72 65 74 75 72 6e 20 6e  !=0..** return n
14f0: 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
1500: 73 73 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74  ss and zero if t
1510: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 20 69 73  he next token is
1520: 20 6e 6f 74 20 61 20 6e 75 6d 62 65 72 2e 0a 2a   not a number..*
1530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
1540: 70 6f 6c 79 50 61 72 73 65 4e 75 6d 62 65 72 28  polyParseNumber(
1550: 47 65 6f 50 61 72 73 65 20 2a 70 2c 20 47 65 6f  GeoParse *p, Geo
1560: 43 6f 6f 72 64 20 2a 70 56 61 6c 29 7b 0a 20 20  Coord *pVal){.  
1570: 63 68 61 72 20 63 20 3d 20 67 65 6f 70 6f 6c 79  char c = geopoly
1580: 53 6b 69 70 53 70 61 63 65 28 70 29 3b 0a 20 20  SkipSpace(p);.  
1590: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15a0: 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 7a 3b 0a 20  har *z = p->z;. 
15b0: 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e   int j = 0;.  in
15c0: 74 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20 20  t seenDP = 0;.  
15d0: 69 6e 74 20 73 65 65 6e 45 20 3d 20 30 3b 0a 20  int seenE = 0;. 
15e0: 20 69 66 28 20 63 3d 3d 27 2d 27 20 29 7b 0a 20   if( c=='-' ){. 
15f0: 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 63 20     j = 1;.    c 
1600: 3d 20 7a 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 69 66  = z[j];.  }.  if
1610: 28 20 63 3d 3d 27 30 27 20 26 26 20 7a 5b 6a 2b  ( c=='0' && z[j+
1620: 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 6a 2b 31  1]>='0' && z[j+1
1630: 5d 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20  ]<='9' ) return 
1640: 30 3b 0a 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29  0;.  for(;; j++)
1650: 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a  {.    c = z[j];.
1660: 20 20 20 20 69 66 28 20 73 61 66 65 5f 69 73 64      if( safe_isd
1670: 69 67 69 74 28 63 29 20 29 20 63 6f 6e 74 69 6e  igit(c) ) contin
1680: 75 65 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ue;.    if( c=='
1690: 2e 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  .' ){.      if( 
16a0: 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65  z[j-1]=='-' ) re
16b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
16c0: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72  ( seenDP ) retur
16d0: 6e 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 44  n 0;.      seenD
16e0: 50 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  P = 1;.      con
16f0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1700: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
1710: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 69  =='E' ){.      i
1720: 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20 29 20  f( z[j-1]<'0' ) 
1730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1740: 69 66 28 20 73 65 65 6e 45 20 29 20 72 65 74 75  if( seenE ) retu
1750: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 73 65 65  rn -1;.      see
1760: 6e 44 50 20 3d 20 73 65 65 6e 45 20 3d 20 31 3b  nDP = seenE = 1;
1770: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31  .      c = z[j+1
1780: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
1790: 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b  '+' || c=='-' ){
17a0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
17b0: 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d        c = z[j+1]
17c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17d0: 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27  if( c<'0' || c>'
17e0: 39 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  9' ) return 0;. 
17f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1800: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
1810: 20 20 7d 0a 20 20 69 66 28 20 7a 5b 6a 2d 31 5d    }.  if( z[j-1]
1820: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 30 3b  <'0' ) return 0;
1830: 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 23  .  if( pVal ){.#
1840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  ifdef SQLITE_AMA
1850: 4c 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 20 2f  LGAMATION.     /
1860: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 41 74 6f  * The sqlite3Ato
1870: 46 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6d  F() routine is m
1880: 75 63 68 20 6d 75 63 68 20 66 61 73 74 65 72 20  uch much faster 
1890: 74 68 61 6e 20 61 74 6f 66 28 29 2c 20 69 66 20  than atof(), if 
18a0: 69 74 0a 20 20 20 20 20 2a 2a 20 69 73 20 61 76  it.     ** is av
18b0: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ailable */.     
18c0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 28  double r;.     (
18d0: 76 6f 69 64 29 73 71 6c 69 74 65 33 41 74 6f 46  void)sqlite3AtoF
18e0: 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2d  ((const char*)p-
18f0: 3e 7a 2c 20 26 72 2c 20 6a 2c 20 53 51 4c 49 54  >z, &r, j, SQLIT
1900: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 2a 70  E_UTF8);.     *p
1910: 56 61 6c 20 3d 20 72 3b 0a 23 65 6c 73 65 0a 20  Val = r;.#else. 
1920: 20 20 20 20 2a 70 56 61 6c 20 3d 20 28 47 65 6f      *pVal = (Geo
1930: 43 6f 6f 72 64 29 61 74 6f 66 28 28 63 6f 6e 73  Coord)atof((cons
1940: 74 20 63 68 61 72 2a 29 70 2d 3e 7a 29 3b 0a 23  t char*)p->z);.#
1950: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 7a  endif.  }.  p->z
1960: 20 2b 3d 20 6a 3b 0a 20 20 72 65 74 75 72 6e 20   += j;.  return 
1970: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
1980: 68 65 20 69 6e 70 75 74 20 69 73 20 61 20 77 65  he input is a we
1990: 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 61  ll-formed JSON a
19a0: 72 72 61 79 20 6f 66 20 63 6f 6f 72 64 69 6e 61  rray of coordina
19b0: 74 65 73 20 77 69 74 68 20 61 74 20 6c 65 61 73  tes with at leas
19c0: 74 0a 2a 2a 20 66 6f 75 72 20 63 6f 6f 72 64 69  t.** four coordi
19d0: 6e 61 74 65 73 20 61 6e 64 20 77 68 65 72 65 20  nates and where 
19e0: 65 61 63 68 20 63 6f 6f 72 64 69 6e 61 74 65 20  each coordinate 
19f0: 69 73 20 69 74 73 65 6c 66 20 61 20 74 77 6f 2d  is itself a two-
1a00: 76 61 6c 75 65 20 61 72 72 61 79 2c 0a 2a 2a 20  value array,.** 
1a10: 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 65  then convert the
1a20: 20 4a 53 4f 4e 20 69 6e 74 6f 20 61 20 47 65 6f   JSON into a Geo
1a30: 50 6f 6c 79 20 6f 62 6a 65 63 74 20 61 6e 64 20  Poly object and 
1a40: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1a50: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 6f 62 6a 65   to.** that obje
1a60: 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ct..**.** If any
1a70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
1a80: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
1a90: 74 61 74 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67  tatic GeoPoly *g
1aa0: 65 6f 70 6f 6c 79 50 61 72 73 65 4a 73 6f 6e 28  eopolyParseJson(
1ab0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ac0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 52 63  har *z, int *pRc
1ad0: 29 7b 0a 20 20 47 65 6f 50 61 72 73 65 20 73 3b  ){.  GeoParse s;
1ae0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1af0: 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
1b00: 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 29  &s, 0, sizeof(s)
1b10: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 3b 0a 20 20  );.  s.z = z;.  
1b20: 69 66 28 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53  if( geopolySkipS
1b30: 70 61 63 65 28 26 73 29 3d 3d 27 5b 27 20 29 7b  pace(&s)=='[' ){
1b40: 0a 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20  .    s.z++;.    
1b50: 77 68 69 6c 65 28 20 67 65 6f 70 6f 6c 79 53 6b  while( geopolySk
1b60: 69 70 53 70 61 63 65 28 26 73 29 3d 3d 27 5b 27  ipSpace(&s)=='['
1b70: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1b80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
1b90: 20 63 3b 0a 20 20 20 20 20 20 73 2e 7a 2b 2b 3b   c;.      s.z++;
1ba0: 0a 20 20 20 20 20 20 69 66 28 20 73 2e 6e 56 65  .      if( s.nVe
1bb0: 72 74 65 78 3e 3d 73 2e 6e 41 6c 6c 6f 63 20 29  rtex>=s.nAlloc )
1bc0: 7b 0a 20 20 20 20 20 20 20 20 47 65 6f 43 6f 6f  {.        GeoCoo
1bd0: 72 64 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  rd *aNew;.      
1be0: 20 20 73 2e 6e 41 6c 6c 6f 63 20 3d 20 73 2e 6e    s.nAlloc = s.n
1bf0: 41 6c 6c 6f 63 2a 32 20 2b 20 31 36 3b 0a 20 20  Alloc*2 + 16;.  
1c00: 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c        aNew = sql
1c10: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 73  ite3_realloc64(s
1c20: 2e 61 2c 20 73 2e 6e 41 6c 6c 6f 63 2a 73 69 7a  .a, s.nAlloc*siz
1c30: 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 2a 32 20  eof(GeoCoord)*2 
1c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1c50: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1c60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1c80: 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   s.nErr++;.     
1c90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 2e      }.        s.
1cb0: 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  a = aNew;.      
1cc0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 67  }.      while( g
1cd0: 65 6f 70 6f 6c 79 50 61 72 73 65 4e 75 6d 62 65  eopolyParseNumbe
1ce0: 72 28 26 73 2c 20 69 69 3c 3d 31 20 3f 20 26 73  r(&s, ii<=1 ? &s
1cf0: 2e 61 5b 73 2e 6e 56 65 72 74 65 78 2a 32 2b 69  .a[s.nVertex*2+i
1d00: 69 5d 20 3a 20 30 29 20 29 7b 0a 20 20 20 20 20  i] : 0) ){.     
1d10: 20 20 20 69 69 2b 2b 3b 0a 20 20 20 20 20 20 20     ii++;.       
1d20: 20 69 66 28 20 69 69 3d 3d 32 20 29 20 73 2e 6e   if( ii==2 ) s.n
1d30: 56 65 72 74 65 78 2b 2b 3b 0a 20 20 20 20 20 20  Vertex++;.      
1d40: 20 20 63 20 3d 20 67 65 6f 70 6f 6c 79 53 6b 69    c = geopolySki
1d50: 70 53 70 61 63 65 28 26 73 29 3b 0a 20 20 20 20  pSpace(&s);.    
1d60: 20 20 20 20 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20      s.z++;.     
1d70: 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20     if( c==',' ) 
1d80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d90: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 26 26 20    if( c==']' && 
1da0: 69 69 3e 3d 32 20 29 20 62 72 65 61 6b 3b 0a 20  ii>=2 ) break;. 
1db0: 20 20 20 20 20 20 20 73 2e 6e 45 72 72 2b 2b 3b         s.nErr++;
1dc0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1dd0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1de0: 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 6a      goto parse_j
1df0: 73 6f 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  son_err;.      }
1e00: 0a 20 20 20 20 20 20 69 66 28 20 67 65 6f 70 6f  .      if( geopo
1e10: 6c 79 53 6b 69 70 53 70 61 63 65 28 26 73 29 3d  lySkipSpace(&s)=
1e20: 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =',' ){.        
1e30: 73 2e 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  s.z++;.        c
1e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1e50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e60: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 65 6f 70    }.    if( geop
1e70: 6f 6c 79 53 6b 69 70 53 70 61 63 65 28 26 73 29  olySkipSpace(&s)
1e80: 3d 3d 27 5d 27 0a 20 20 20 20 20 26 26 20 73 2e  ==']'.     && s.
1e90: 6e 56 65 72 74 65 78 3e 3d 34 0a 20 20 20 20 20  nVertex>=4.     
1ea0: 26 26 20 73 2e 61 5b 30 5d 3d 3d 73 2e 61 5b 73  && s.a[0]==s.a[s
1eb0: 2e 6e 56 65 72 74 65 78 2a 32 2d 32 5d 0a 20 20  .nVertex*2-2].  
1ec0: 20 20 20 26 26 20 73 2e 61 5b 31 5d 3d 3d 73 2e     && s.a[1]==s.
1ed0: 61 5b 73 2e 6e 56 65 72 74 65 78 2a 32 2d 31 5d  a[s.nVertex*2-1]
1ee0: 0a 20 20 20 20 20 26 26 20 28 73 2e 7a 2b 2b 2c  .     && (s.z++,
1ef0: 20 67 65 6f 70 6f 6c 79 53 6b 69 70 53 70 61 63   geopolySkipSpac
1f00: 65 28 26 73 29 3d 3d 30 29 0a 20 20 20 20 29 7b  e(&s)==0).    ){
1f10: 0a 20 20 20 20 20 20 47 65 6f 50 6f 6c 79 20 2a  .      GeoPoly *
1f20: 70 4f 75 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  pOut;.      int 
1f30: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 2e 6e  x = 1;.      s.n
1f40: 56 65 72 74 65 78 2d 2d 3b 20 20 2f 2a 20 52 65  Vertex--;  /* Re
1f50: 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1f60: 6e 74 20 76 65 72 74 65 78 20 61 74 20 74 68 65  nt vertex at the
1f70: 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 70 4f   end */.      pO
1f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ut = sqlite3_mal
1f90: 6c 6f 63 36 34 28 20 47 45 4f 50 4f 4c 59 5f 53  loc64( GEOPOLY_S
1fa0: 5a 28 73 2e 6e 56 65 72 74 65 78 29 20 29 3b 0a  Z(s.nVertex) );.
1fb0: 20 20 20 20 20 20 78 20 3d 20 31 3b 0a 20 20 20        x = 1;.   
1fc0: 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29     if( pOut==0 )
1fd0: 20 67 6f 74 6f 20 70 61 72 73 65 5f 6a 73 6f 6e   goto parse_json
1fe0: 5f 65 72 72 3b 0a 20 20 20 20 20 20 70 4f 75 74  _err;.      pOut
1ff0: 2d 3e 6e 56 65 72 74 65 78 20 3d 20 73 2e 6e 56  ->nVertex = s.nV
2000: 65 72 74 65 78 3b 0a 20 20 20 20 20 20 6d 65 6d  ertex;.      mem
2010: 63 70 79 28 70 4f 75 74 2d 3e 61 2c 20 73 2e 61  cpy(pOut->a, s.a
2020: 2c 20 73 2e 6e 56 65 72 74 65 78 2a 32 2a 73 69  , s.nVertex*2*si
2030: 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 29 3b  zeof(GeoCoord));
2040: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72  .      pOut->hdr
2050: 5b 30 5d 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64  [0] = *(unsigned
2060: 20 63 68 61 72 2a 29 26 78 3b 0a 20 20 20 20 20   char*)&x;.     
2070: 20 70 4f 75 74 2d 3e 68 64 72 5b 31 5d 20 3d 20   pOut->hdr[1] = 
2080: 28 73 2e 6e 56 65 72 74 65 78 3e 3e 31 36 29 26  (s.nVertex>>16)&
2090: 30 78 66 66 3b 0a 20 20 20 20 20 20 70 4f 75 74  0xff;.      pOut
20a0: 2d 3e 68 64 72 5b 32 5d 20 3d 20 28 73 2e 6e 56  ->hdr[2] = (s.nV
20b0: 65 72 74 65 78 3e 3e 38 29 26 30 78 66 66 3b 0a  ertex>>8)&0xff;.
20c0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b        pOut->hdr[
20d0: 33 5d 20 3d 20 73 2e 6e 56 65 72 74 65 78 26 30  3] = s.nVertex&0
20e0: 78 66 66 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xff;.      sqlit
20f0: 65 33 5f 66 72 65 65 28 73 2e 61 29 3b 0a 20 20  e3_free(s.a);.  
2100: 20 20 20 20 69 66 28 20 70 52 63 20 29 20 2a 70      if( pRc ) *p
2110: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  Rc = SQLITE_OK;.
2120: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 75        return pOu
2130: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2140: 20 20 20 20 73 2e 6e 45 72 72 2b 2b 3b 0a 20 20      s.nErr++;.  
2150: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2160: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
2170: 0a 70 61 72 73 65 5f 6a 73 6f 6e 5f 65 72 72 3a  .parse_json_err:
2180: 0a 20 20 69 66 28 20 70 52 63 20 29 20 2a 70 52  .  if( pRc ) *pR
2190: 63 20 3d 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  c = rc;.  sqlite
21a0: 33 5f 66 72 65 65 28 73 2e 61 29 3b 0a 20 20 72  3_free(s.a);.  r
21b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21c0: 2a 20 47 69 76 65 6e 20 61 20 66 75 6e 63 74 69  * Given a functi
21d0: 6f 6e 20 70 61 72 61 6d 65 74 65 72 2c 20 74 72  on parameter, tr
21e0: 79 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 69  y to interpret i
21f0: 74 20 61 73 20 61 20 70 6f 6c 79 67 6f 6e 2c 20  t as a polygon, 
2200: 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65  either.** in the
2210: 20 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 6f   binary format o
2220: 72 20 4a 53 4f 4e 20 74 65 78 74 2e 20 20 43 6f  r JSON text.  Co
2230: 6d 70 75 74 65 20 61 20 47 65 6f 50 6f 6c 79 20  mpute a GeoPoly 
2240: 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 72 65  object and.** re
2250: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2260: 6f 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 20  o that object.  
2270: 4f 72 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  Or if the input 
2280: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
2290: 72 6d 65 64 0a 2a 2a 20 70 6f 6c 79 67 6f 6e 2c  rmed.** polygon,
22a0: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 6d 65   put an error me
22b0: 73 73 61 67 65 20 69 6e 20 73 71 6c 69 74 65 33  ssage in sqlite3
22c0: 5f 63 6f 6e 74 65 78 74 20 61 6e 64 20 72 65 74  _context and ret
22d0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
22e0: 74 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67 65 6f  tic GeoPoly *geo
22f0: 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 0a 20  polyFuncParam(. 
2300: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2310: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20   *pCtx,      /* 
2320: 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
2330: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
2340: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2350: 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Val,        /* T
2360: 68 65 20 76 61 6c 75 65 20 74 6f 20 64 65 63 6f  he value to deco
2370: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  de */.  int *pRc
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72      /* Write err
23a0: 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
23b0: 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 30 3b 0a  GeoPoly *p = 0;.
23c0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
23d0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
23e0: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
23f0: 49 54 45 5f 42 4c 4f 42 0a 20 20 20 26 26 20 28  ITE_BLOB.   && (
2400: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
2410: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
2420: 29 29 3e 3d 28 34 2b 36 2a 73 69 7a 65 6f 66 28  ))>=(4+6*sizeof(
2430: 47 65 6f 43 6f 6f 72 64 29 29 0a 20 20 29 7b 0a  GeoCoord)).  ){.
2440: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
2450: 65 64 20 63 68 61 72 20 2a 61 20 3d 20 73 71 6c  ed char *a = sql
2460: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
2470: 70 56 61 6c 29 3b 0a 20 20 20 20 69 6e 74 20 6e  pVal);.    int n
2480: 56 65 72 74 65 78 3b 0a 20 20 20 20 6e 56 65 72  Vertex;.    nVer
2490: 74 65 78 20 3d 20 28 61 5b 31 5d 3c 3c 31 36 29  tex = (a[1]<<16)
24a0: 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
24b0: 5b 33 5d 3b 0a 20 20 20 20 69 66 28 20 28 61 5b  [3];.    if( (a[
24c0: 30 5d 3d 3d 30 20 7c 7c 20 61 5b 30 5d 3d 3d 31  0]==0 || a[0]==1
24d0: 29 0a 20 20 20 20 20 26 26 20 28 6e 56 65 72 74  ).     && (nVert
24e0: 65 78 2a 32 2a 73 69 7a 65 6f 66 28 47 65 6f 43  ex*2*sizeof(GeoC
24f0: 6f 6f 72 64 29 20 2b 20 34 29 3d 3d 28 75 6e 73  oord) + 4)==(uns
2500: 69 67 6e 65 64 20 69 6e 74 29 6e 42 79 74 65 0a  igned int)nByte.
2510: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 20 3d      ){.      p =
2520: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2530: 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20  4( sizeof(*p) + 
2540: 28 6e 56 65 72 74 65 78 2d 31 29 2a 32 2a 73 69  (nVertex-1)*2*si
2550: 7a 65 6f 66 28 47 65 6f 43 6f 6f 72 64 29 20 29  zeof(GeoCoord) )
2560: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30  ;.      if( p==0
2570: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2580: 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51 4c  pRc ) *pRc = SQL
2590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
25a0: 20 20 20 69 66 28 20 70 43 74 78 20 29 20 73 71     if( pCtx ) sq
25b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
25c0: 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a  or_nomem(pCtx);.
25d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25e0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 31 3b 0a       int x = 1;.
25f0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 56 65 72 74          p->nVert
2600: 65 78 20 3d 20 6e 56 65 72 74 65 78 3b 0a 20 20  ex = nVertex;.  
2610: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
2620: 68 64 72 2c 20 61 2c 20 6e 42 79 74 65 29 3b 0a  hdr, a, nByte);.
2630: 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d          if( a[0]
2640: 20 21 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63   != *(unsigned c
2650: 68 61 72 2a 29 26 78 20 29 7b 0a 20 20 20 20 20  har*)&x ){.     
2660: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2670: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
2680: 20 69 69 3c 6e 56 65 72 74 65 78 2a 32 3b 20 69   ii<nVertex*2; i
2690: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
26a0: 20 20 67 65 6f 70 6f 6c 79 53 77 61 62 33 32 28    geopolySwab32(
26b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
26c0: 26 70 2d 3e 61 5b 69 69 5d 29 3b 0a 20 20 20 20  &p->a[ii]);.    
26d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26e0: 20 20 70 2d 3e 68 64 72 5b 30 5d 20 5e 3d 20 31    p->hdr[0] ^= 1
26f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2710: 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53  ( pRc ) *pRc = S
2720: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
2730: 74 75 72 6e 20 70 3b 0a 20 20 7d 65 6c 73 65 20  turn p;.  }else 
2740: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
2750: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
2760: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
2770: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2780: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 3d 20 73 71  char *zJson = sq
2790: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
27a0: 28 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pVal);.    if( 
27b0: 7a 4a 73 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  zJson==0 ){.    
27c0: 20 20 69 66 28 20 70 52 63 20 29 20 2a 70 52 63    if( pRc ) *pRc
27d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
27e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
27f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2800: 6e 20 67 65 6f 70 6f 6c 79 50 61 72 73 65 4a 73  n geopolyParseJs
2810: 6f 6e 28 7a 4a 73 6f 6e 2c 20 70 52 63 29 3b 0a  on(zJson, pRc);.
2820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2830: 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20 53 51   pRc ) *pRc = SQ
2840: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
2860: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2870: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f  ation of the geo
2880: 70 6f 6c 79 5f 62 6c 6f 62 28 58 29 20 66 75 6e  poly_blob(X) fun
2890: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
28a0: 74 68 65 20 69 6e 70 75 74 20 69 73 20 61 20 77  the input is a w
28b0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 47 65 6f 70 6f  ell-formed Geopo
28c0: 6c 79 20 42 4c 4f 42 20 6f 72 20 4a 53 4f 4e 20  ly BLOB or JSON 
28d0: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 65 6e 20 72  string.** then r
28e0: 65 74 75 72 6e 20 74 68 65 20 42 4c 4f 42 20 72  eturn the BLOB r
28f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2900: 20 74 68 65 20 70 6f 6c 79 67 6f 6e 2e 20 20 4f   the polygon.  O
2910: 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
2920: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2930: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42  ic void geopolyB
2940: 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  lobFunc(.  sqlit
2950: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2960: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
2970: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2980: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f   **argv.){.  Geo
2990: 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c  Poly *p = geopol
29a0: 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65  yFuncParam(conte
29b0: 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b  xt, argv[0], 0);
29c0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
29d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
29e0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  lob(context, p->
29f0: 68 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38  hdr, .       4+8
2a00: 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c  *p->nVertex, SQL
2a10: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a30: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
2a40: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
2a50: 20 20 20 20 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e      geopoly_json
2a60: 28 58 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  (X).**.** Interp
2a70: 72 65 74 20 58 20 61 73 20 61 20 70 6f 6c 79 67  ret X as a polyg
2a80: 6f 6e 20 61 6e 64 20 72 65 6e 64 65 72 20 69 74  on and render it
2a90: 20 61 73 20 61 20 4a 53 4f 4e 20 61 72 72 61 79   as a JSON array
2aa0: 0a 2a 2a 20 6f 66 20 63 6f 6f 72 64 69 6e 61 74  .** of coordinat
2ab0: 65 73 2e 20 20 4f 72 2c 20 69 66 20 58 20 69 73  es.  Or, if X is
2ac0: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 6c   not a valid pol
2ad0: 79 67 6f 6e 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ygon, return NUL
2ae0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
2af0: 64 20 67 65 6f 70 6f 6c 79 4a 73 6f 6e 46 75 6e  d geopolyJsonFun
2b00: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2b10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
2b20: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
2b30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
2b40: 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  v.){.  GeoPoly *
2b50: 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50  p = geopolyFuncP
2b60: 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72  aram(context, ar
2b70: 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28  gv[0], 0);.  if(
2b80: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
2b90: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
2ba0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
2bb0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
2bc0: 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 78 20 3d  sqlite3_str *x =
2bd0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77   sqlite3_str_new
2be0: 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  (db);.    int i;
2bf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
2c00: 5f 61 70 70 65 6e 64 28 78 2c 20 22 5b 22 2c 20  _append(x, "[", 
2c10: 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  1);.    for(i=0;
2c20: 20 69 3c 70 2d 3e 6e 56 65 72 74 65 78 3b 20 69   i<p->nVertex; i
2c30: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2c40: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78  e3_str_appendf(x
2c50: 2c 20 22 5b 25 21 67 2c 25 21 67 5d 2c 22 2c 20  , "[%!g,%!g],", 
2c60: 70 2d 3e 61 5b 69 2a 32 5d 2c 20 70 2d 3e 61 5b  p->a[i*2], p->a[
2c70: 69 2a 32 2b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  i*2+1]);.    }. 
2c80: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
2c90: 70 70 65 6e 64 66 28 78 2c 20 22 5b 25 21 67 2c  ppendf(x, "[%!g,
2ca0: 25 21 67 5d 5d 22 2c 20 70 2d 3e 61 5b 30 5d 2c  %!g]]", p->a[0],
2cb0: 20 70 2d 3e 61 5b 31 5d 29 3b 0a 20 20 20 20 73   p->a[1]);.    s
2cc0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2cd0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
2ce0: 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 78  te3_str_finish(x
2cf0: 29 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  ), -1, sqlite3_f
2d00: 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
2d10: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
2d20: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63  ../*.** SQL func
2d30: 74 69 6f 6e 3a 20 20 20 20 20 67 65 6f 70 6f 6c  tion:     geopol
2d40: 79 5f 73 76 67 28 58 2c 20 2e 2e 2e 2e 29 0a 2a  y_svg(X, ....).*
2d50: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 58  *.** Interpret X
2d60: 20 61 73 20 61 20 70 6f 6c 79 67 6f 6e 20 61 6e   as a polygon an
2d70: 64 20 72 65 6e 64 65 72 20 69 74 20 61 73 20 61  d render it as a
2d80: 20 53 56 47 20 3c 70 6f 6c 79 6c 69 6e 65 3e 2e   SVG <polyline>.
2d90: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 61  .** Additional a
2da0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 64 64  rguments are add
2db0: 65 64 20 61 73 20 61 74 74 72 69 62 75 74 65 73  ed as attributes
2dc0: 20 74 6f 20 74 68 65 20 3c 70 6f 6c 79 6c 69 6e   to the <polylin
2dd0: 65 3e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e>..*/.static vo
2de0: 69 64 20 67 65 6f 70 6f 6c 79 53 76 67 46 75 6e  id geopolySvgFun
2df0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2e00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
2e10: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
2e20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
2e30: 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  v.){.  GeoPoly *
2e40: 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50  p = geopolyFuncP
2e50: 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72  aram(context, ar
2e60: 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28  gv[0], 0);.  if(
2e70: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
2e80: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
2e90: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
2ea0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
2eb0: 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 78 20 3d  sqlite3_str *x =
2ec0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77   sqlite3_str_new
2ed0: 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  (db);.    int i;
2ee0: 0a 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d  .    char cSep =
2ef0: 20 27 5c 27 27 3b 0a 20 20 20 20 73 71 6c 69 74   '\'';.    sqlit
2f00: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78  e3_str_appendf(x
2f10: 2c 20 22 3c 70 6f 6c 79 6c 69 6e 65 20 70 6f 69  , "<polyline poi
2f20: 6e 74 73 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28  nts=");.    for(
2f30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 56 65 72 74 65  i=0; i<p->nVerte
2f40: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  x; i++){.      s
2f50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
2f60: 64 66 28 78 2c 20 22 25 63 25 67 2c 25 67 22 2c  df(x, "%c%g,%g",
2f70: 20 63 53 65 70 2c 20 70 2d 3e 61 5b 69 2a 32 5d   cSep, p->a[i*2]
2f80: 2c 20 70 2d 3e 61 5b 69 2a 32 2b 31 5d 29 3b 0a  , p->a[i*2+1]);.
2f90: 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 20 27        cSep = ' '
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2fb0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
2fc0: 78 2c 20 22 20 25 67 2c 25 67 27 22 2c 20 70 2d  x, " %g,%g'", p-
2fd0: 3e 61 5b 30 5d 2c 20 70 2d 3e 61 5b 31 5d 29 3b  >a[0], p->a[1]);
2fe0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2ff0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
3000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
3010: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
3020: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
3030: 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
3040: 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20    if( z && z[0] 
3050: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3060: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 78  e3_str_appendf(x
3070: 2c 20 22 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  , " %s", z);.   
3080: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3090: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
30a0: 64 66 28 78 2c 20 22 3e 3c 2f 70 6f 6c 79 6c 69  df(x, "></polyli
30b0: 6e 65 3e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ne>");.    sqlit
30c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
30d0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
30e0: 73 74 72 5f 66 69 6e 69 73 68 28 78 29 2c 20 2d  str_finish(x), -
30f0: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
3100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
3110: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
3120: 0a 2a 2a 20 53 51 4c 20 46 75 6e 63 74 69 6f 6e  .** SQL Function
3130: 3a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f 78  :      geopoly_x
3140: 66 6f 72 6d 28 70 6f 6c 79 2c 20 41 2c 20 42 2c  form(poly, A, B,
3150: 20 43 2c 20 44 2c 20 45 2c 20 46 29 0a 2a 2a 0a   C, D, E, F).**.
3160: 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 20 61 6e 64  ** Transform and
3170: 2f 6f 72 20 74 72 61 6e 73 6c 61 74 65 20 61 20  /or translate a 
3180: 70 6f 6c 79 67 6f 6e 20 61 73 20 66 6f 6c 6c 6f  polygon as follo
3190: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  ws:.**.**      x
31a0: 31 20 3d 20 41 2a 78 30 20 2b 20 42 2a 79 30 20  1 = A*x0 + B*y0 
31b0: 2b 20 45 0a 2a 2a 20 20 20 20 20 20 79 31 20 3d  + E.**      y1 =
31c0: 20 43 2a 78 30 20 2b 20 44 2a 79 30 20 2b 20 46   C*x0 + D*y0 + F
31d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 72 61  .**.** For a tra
31e0: 6e 73 6c 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  nslation:.**.** 
31f0: 20 20 20 20 20 67 65 6f 70 6f 6c 79 5f 78 66 6f       geopoly_xfo
3200: 72 6d 28 70 6f 6c 79 2c 20 31 2c 20 30 2c 20 30  rm(poly, 1, 0, 0
3210: 2c 20 31 2c 20 78 2d 6f 66 66 73 65 74 2c 20 79  , 1, x-offset, y
3220: 2d 6f 66 66 73 65 74 29 0a 2a 2a 0a 2a 2a 20 52  -offset).**.** R
3230: 6f 74 61 74 65 20 62 79 20 52 20 61 72 6f 75 6e  otate by R aroun
3240: 64 20 74 68 65 20 70 6f 69 6e 74 20 28 30 2c 30  d the point (0,0
3250: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 67 65  ):.**.**      ge
3260: 6f 70 6f 6c 79 5f 78 66 6f 72 6d 28 70 6f 6c 79  opoly_xform(poly
3270: 2c 20 63 6f 73 28 52 29 2c 20 73 69 6e 28 52 29  , cos(R), sin(R)
3280: 2c 20 2d 73 69 6e 28 52 29 2c 20 63 6f 73 28 52  , -sin(R), cos(R
3290: 29 2c 20 30 2c 20 30 29 0a 2a 2f 0a 73 74 61 74  ), 0, 0).*/.stat
32a0: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 58  ic void geopolyX
32b0: 66 6f 72 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  formFunc(.  sqli
32c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
32d0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
32e0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
32f0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65  e **argv.){.  Ge
3300: 6f 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f  oPoly *p = geopo
3310: 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74  lyFuncParam(cont
3320: 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29  ext, argv[0], 0)
3330: 3b 0a 20 20 64 6f 75 62 6c 65 20 41 20 3d 20 73  ;.  double A = s
3340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3350: 62 6c 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ble(argv[1]);.  
3360: 64 6f 75 62 6c 65 20 42 20 3d 20 73 71 6c 69 74  double B = sqlit
3370: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3380: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 6f 75 62  argv[2]);.  doub
3390: 6c 65 20 43 20 3d 20 73 71 6c 69 74 65 33 5f 76  le C = sqlite3_v
33a0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
33b0: 5b 33 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 44  [3]);.  double D
33c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
33d0: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 34 5d 29  _double(argv[4])
33e0: 3b 0a 20 20 64 6f 75 62 6c 65 20 45 20 3d 20 73  ;.  double E = s
33f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
3400: 62 6c 65 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20  ble(argv[5]);.  
3410: 64 6f 75 62 6c 65 20 46 20 3d 20 73 71 6c 69 74  double F = sqlit
3420: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
3430: 61 72 67 76 5b 36 5d 29 3b 0a 20 20 47 65 6f 43  argv[6]);.  GeoC
3440: 6f 6f 72 64 20 78 31 2c 20 79 31 2c 20 78 30 2c  oord x1, y1, x0,
3450: 20 79 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20   y0;.  int ii;. 
3460: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
3470: 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 6e 56  r(ii=0; ii<p->nV
3480: 65 72 74 65 78 3b 20 69 69 2b 2b 29 7b 0a 20 20  ertex; ii++){.  
3490: 20 20 20 20 78 30 20 3d 20 70 2d 3e 61 5b 69 69      x0 = p->a[ii
34a0: 2a 32 5d 3b 0a 20 20 20 20 20 20 79 30 20 3d 20  *2];.      y0 = 
34b0: 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20 20  p->a[ii*2+1];.  
34c0: 20 20 20 20 78 31 20 3d 20 28 47 65 6f 43 6f 6f      x1 = (GeoCoo
34d0: 72 64 29 28 41 2a 78 30 20 2b 20 42 2a 79 30 20  rd)(A*x0 + B*y0 
34e0: 2b 20 45 29 3b 0a 20 20 20 20 20 20 79 31 20 3d  + E);.      y1 =
34f0: 20 28 47 65 6f 43 6f 6f 72 64 29 28 43 2a 78 30   (GeoCoord)(C*x0
3500: 20 2b 20 44 2a 79 30 20 2b 20 46 29 3b 0a 20 20   + D*y0 + F);.  
3510: 20 20 20 20 70 2d 3e 61 5b 69 69 2a 32 5d 20 3d      p->a[ii*2] =
3520: 20 78 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b   x1;.      p->a[
3530: 69 69 2a 32 2b 31 5d 20 3d 20 79 31 3b 0a 20 20  ii*2+1] = y1;.  
3540: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
3550: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74  result_blob(cont
3560: 65 78 74 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20  ext, p->hdr, .  
3570: 20 20 20 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72       4+8*p->nVer
3580: 74 65 78 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tex, SQLITE_TRAN
3590: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
35a0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
35b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
35c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
35d0: 67 65 6f 70 6f 6c 79 5f 61 72 65 61 28 58 29 20  geopoly_area(X) 
35e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
35f0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
3600: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 47 65  a well-formed Ge
3610: 6f 70 6f 6c 79 20 42 4c 4f 42 20 74 68 65 6e 20  opoly BLOB then 
3620: 72 65 74 75 72 6e 20 74 68 65 20 61 72 65 61 0a  return the area.
3630: 2a 2a 20 65 6e 63 6c 6f 73 65 64 20 62 79 20 74  ** enclosed by t
3640: 68 65 20 70 6f 6c 79 67 6f 6e 2e 20 20 49 66 20  he polygon.  If 
3650: 74 68 65 20 70 6f 6c 79 67 6f 6e 20 63 69 72 63  the polygon circ
3660: 75 6c 61 74 65 73 20 63 6c 6f 63 6b 77 69 73 65  ulates clockwise
3670: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 63   instead.** of c
3680: 6f 75 6e 74 65 72 63 6c 6f 63 6b 77 69 73 65 20  ounterclockwise 
3690: 28 61 73 20 69 74 20 73 68 6f 75 6c 64 29 20 74  (as it should) t
36a0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
36b0: 65 67 61 74 69 76 65 20 6f 66 20 74 68 65 0a 2a  egative of the.*
36c0: 2a 20 65 6e 63 6c 6f 73 65 64 20 61 72 65 61 2e  * enclosed area.
36d0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
36e0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
36f0: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41  ic void geopolyA
3700: 72 65 61 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  reaFunc(.  sqlit
3710: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3720: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
3730: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3740: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f   **argv.){.  Geo
3750: 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c  Poly *p = geopol
3760: 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65  yFuncParam(conte
3770: 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b  xt, argv[0], 0);
3780: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
3790: 64 6f 75 62 6c 65 20 72 41 72 65 61 20 3d 20 30  double rArea = 0
37a0: 2e 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  .0;.    int ii;.
37b0: 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37c0: 3c 70 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69  <p->nVertex-1; i
37d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 41 72 65  i++){.      rAre
37e0: 61 20 2b 3d 20 28 70 2d 3e 61 5b 69 69 2a 32 5d  a += (p->a[ii*2]
37f0: 20 2d 20 70 2d 3e 61 5b 69 69 2a 32 2b 32 5d 29   - p->a[ii*2+2])
3800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 78             /* (x
3810: 30 20 2d 20 78 31 29 20 2a 2f 0a 20 20 20 20 20  0 - x1) */.     
3820: 20 20 20 20 20 20 20 20 20 20 20 2a 20 28 70 2d             * (p-
3830: 3e 61 5b 69 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e  >a[ii*2+1] + p->
3840: 61 5b 69 69 2a 32 2b 33 5d 29 20 20 20 20 20 20  a[ii*2+3])      
3850: 2f 2a 20 28 79 30 20 2b 20 79 31 29 20 2a 2f 0a  /* (y0 + y1) */.
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 2a 20 30 2e 35 3b 0a 20 20 20 20 7d 0a 20 20 20  * 0.5;.    }.   
3880: 20 72 41 72 65 61 20 2b 3d 20 28 70 2d 3e 61 5b   rArea += (p->a[
3890: 69 69 2a 32 5d 20 2d 20 70 2d 3e 61 5b 30 5d 29  ii*2] - p->a[0])
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 2f 2a 20 28 78 4e 20 2d 20 78 30 29 20 2a    /* (xN - x0) *
38c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  /.             *
38d0: 20 28 70 2d 3e 61 5b 69 69 2a 32 2b 31 5d 20 2b   (p->a[ii*2+1] +
38e0: 20 70 2d 3e 61 5b 31 5d 29 20 20 20 20 20 20 20   p->a[1])       
38f0: 20 20 20 20 20 20 20 2f 2a 20 28 79 4e 20 2b 20         /* (yN + 
3900: 79 30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  y0) */.         
3910: 20 20 20 20 2a 20 30 2e 35 3b 0a 20 20 20 20 73      * 0.5;.    s
3920: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
3930: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 41  uble(context, rA
3940: 72 65 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rea);.    sqlite
3950: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 20 20  3_free(p);.  }  
3960: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a            .}../*
3970: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
3980: 6f 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c  on of the geopol
3990: 79 5f 72 65 76 65 72 73 65 28 58 29 20 66 75 6e  y_reverse(X) fun
39a0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 76  ction..**.** Rev
39b0: 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f  erse the order o
39c0: 66 20 74 68 65 20 76 65 72 74 65 78 65 73 20 69  f the vertexes i
39d0: 6e 20 70 6f 6c 79 67 6f 6e 20 58 2e 20 20 54 68  n polygon X.  Th
39e0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  is can be used.*
39f0: 2a 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 6e 20  * to convert an 
3a00: 68 69 73 74 6f 72 69 63 61 6c 20 70 6f 6c 79 67  historical polyg
3a10: 6f 6e 20 74 68 61 74 20 75 73 65 73 20 61 20 63  on that uses a c
3a20: 6c 6f 63 6b 77 69 73 65 20 72 6f 74 61 74 69 6f  lockwise rotatio
3a30: 6e 20 69 6e 74 6f 0a 2a 2a 20 61 20 77 65 6c 6c  n into.** a well
3a40: 2d 66 6f 72 6d 65 64 20 47 65 6f 4a 53 4f 4e 20  -formed GeoJSON 
3a50: 70 6f 6c 79 67 6f 6e 20 74 68 61 74 20 75 73 65  polygon that use
3a60: 73 20 63 6f 75 6e 74 65 72 2d 63 6c 6f 63 6b 77  s counter-clockw
3a70: 69 73 65 20 72 6f 74 61 74 69 6f 6e 2e 0a 2a 2f  ise rotation..*/
3a80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
3a90: 70 6f 6c 79 52 65 76 65 72 73 65 46 75 6e 63 28  polyReverseFunc(
3aa0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3ab0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
3ac0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
3ad0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3ae0: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20  ){.  GeoPoly *p 
3af0: 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72  = geopolyFuncPar
3b00: 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  am(context, argv
3b10: 5b 30 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [0], 0);.  if( p
3b20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20   ){.    int ii, 
3b30: 6a 6a 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 32  jj;.    for(ii=2
3b40: 2c 20 6a 6a 3d 70 2d 3e 6e 56 65 72 74 65 78 2a  , jj=p->nVertex*
3b50: 32 20 2d 20 34 3b 20 69 69 3c 6a 6a 3b 20 69 69  2 - 4; ii<jj; ii
3b60: 2b 3d 32 2c 20 6a 6a 2d 3d 32 29 7b 0a 20 20 20  +=2, jj-=2){.   
3b70: 20 20 20 47 65 6f 43 6f 6f 72 64 20 74 20 3d 20     GeoCoord t = 
3b80: 70 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  p->a[ii];.      
3b90: 70 2d 3e 61 5b 69 69 5d 20 3d 20 70 2d 3e 61 5b  p->a[ii] = p->a[
3ba0: 6a 6a 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  jj];.      p->a[
3bb0: 6a 6a 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 74  jj] = t;.      t
3bc0: 20 3d 20 70 2d 3e 61 5b 69 69 2b 31 5d 3b 0a 20   = p->a[ii+1];. 
3bd0: 20 20 20 20 20 70 2d 3e 61 5b 69 69 2b 31 5d 20       p->a[ii+1] 
3be0: 3d 20 70 2d 3e 61 5b 6a 6a 2b 31 5d 3b 0a 20 20  = p->a[jj+1];.  
3bf0: 20 20 20 20 70 2d 3e 61 5b 6a 6a 2b 31 5d 20 3d      p->a[jj+1] =
3c00: 20 74 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20 73   t;..    }.    s
3c10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
3c20: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68  ob(context, p->h
3c30: 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38 2a  dr, .       4+8*
3c40: 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c 49  p->nVertex, SQLI
3c50: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3c60: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3c70: 70 29 3b 0a 20 20 7d 20 20 20 20 20 20 20 20 20  p);.  }         
3c80: 20 20 20 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 47     .}..#define G
3c90: 45 4f 50 4f 4c 59 5f 50 49 20 33 2e 31 34 31 35  EOPOLY_PI 3.1415
3ca0: 39 32 36 35 33 35 38 39 37 39 33 32 33 38 35 0a  926535897932385.
3cb0: 0a 2f 2a 20 46 61 73 74 20 61 70 70 72 6f 78 69  ./* Fast approxi
3cc0: 6d 61 74 69 6f 6e 20 66 6f 72 20 63 6f 73 69 6e  mation for cosin
3cd0: 65 28 58 29 20 66 6f 72 20 58 20 62 65 74 77 65  e(X) for X betwe
3ce0: 65 6e 20 2d 30 2e 35 2a 70 69 20 61 6e 64 20 32  en -0.5*pi and 2
3cf0: 2a 70 69 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  *pi.*/.static do
3d00: 75 62 6c 65 20 67 65 6f 70 6f 6c 79 43 6f 73 69  uble geopolyCosi
3d10: 6e 65 28 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  ne(double r){.  
3d20: 61 73 73 65 72 74 28 20 72 3e 3d 2d 30 2e 35 2a  assert( r>=-0.5*
3d30: 47 45 4f 50 4f 4c 59 5f 50 49 20 26 26 20 72 3c  GEOPOLY_PI && r<
3d40: 3d 32 2e 30 2a 47 45 4f 50 4f 4c 59 5f 50 49 20  =2.0*GEOPOLY_PI 
3d50: 29 3b 0a 20 20 69 66 28 20 72 3e 3d 31 2e 35 2a  );.  if( r>=1.5*
3d60: 47 45 4f 50 4f 4c 59 5f 50 49 20 29 7b 0a 20 20  GEOPOLY_PI ){.  
3d70: 20 20 72 20 2d 3d 20 32 2e 30 2a 47 45 4f 50 4f    r -= 2.0*GEOPO
3d80: 4c 59 5f 50 49 3b 0a 20 20 7d 0a 20 20 69 66 28  LY_PI;.  }.  if(
3d90: 20 72 3e 3d 30 2e 35 2a 47 45 4f 50 4f 4c 59 5f   r>=0.5*GEOPOLY_
3da0: 50 49 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  PI ){.    return
3db0: 20 2d 67 65 6f 70 6f 6c 79 43 6f 73 69 6e 65 28   -geopolyCosine(
3dc0: 72 2d 47 45 4f 50 4f 4c 59 5f 50 49 29 3b 0a 20  r-GEOPOLY_PI);. 
3dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62   }else{.    doub
3de0: 6c 65 20 72 32 20 3d 20 72 2a 72 3b 0a 20 20 20  le r2 = r*r;.   
3df0: 20 64 6f 75 62 6c 65 20 72 33 20 3d 20 72 32 2a   double r3 = r2*
3e00: 72 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 35  r;.    double r5
3e10: 20 3d 20 72 33 2a 72 32 3b 0a 20 20 20 20 72 65   = r3*r2;.    re
3e20: 74 75 72 6e 20 30 2e 39 39 39 36 39 34 39 2a 72  turn 0.9996949*r
3e30: 20 2d 20 30 2e 31 36 35 36 37 30 30 2a 72 33 20   - 0.1656700*r3 
3e40: 2b 20 30 2e 30 30 37 35 31 33 34 2a 72 35 3b 0a  + 0.0075134*r5;.
3e50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e    }.}../*.** Fun
3e60: 63 74 69 6f 6e 3a 20 20 20 67 65 6f 70 6f 6c 79  ction:   geopoly
3e70: 5f 72 65 67 75 6c 61 72 28 58 2c 59 2c 52 2c 4e  _regular(X,Y,R,N
3e80: 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ).**.** Construc
3e90: 74 20 61 20 73 69 6d 70 6c 65 2c 20 63 6f 6e 76  t a simple, conv
3ea0: 65 78 2c 20 72 65 67 75 6c 61 72 20 70 6f 6c 79  ex, regular poly
3eb0: 67 6f 6e 20 63 65 6e 74 65 72 65 64 20 61 74 20  gon centered at 
3ec0: 58 2c 20 59 0a 2a 2a 20 77 69 74 68 20 63 69 72  X, Y.** with cir
3ed0: 63 75 6d 72 61 64 69 75 73 20 52 20 61 6e 64 20  cumradius R and 
3ee0: 77 69 74 68 20 4e 20 73 69 64 65 73 2e 0a 2a 2f  with N sides..*/
3ef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
3f00: 70 6f 6c 79 52 65 67 75 6c 61 72 46 75 6e 63 28  polyRegularFunc(
3f10: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3f20: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
3f30: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
3f40: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3f50: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20  ){.  double x = 
3f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
3f70: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
3f80: 20 64 6f 75 62 6c 65 20 79 20 3d 20 73 71 6c 69   double y = sqli
3f90: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
3fa0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 64 6f 75  (argv[1]);.  dou
3fb0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
3fc0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
3fd0: 76 5b 32 5d 29 3b 0a 20 20 69 6e 74 20 6e 20 3d  v[2]);.  int n =
3fe0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3ff0: 6e 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  nt(argv[3]);.  i
4000: 6e 74 20 69 3b 0a 20 20 47 65 6f 50 6f 6c 79 20  nt i;.  GeoPoly 
4010: 2a 70 3b 0a 0a 20 20 69 66 28 20 6e 3c 33 20 7c  *p;..  if( n<3 |
4020: 7c 20 72 3c 3d 30 2e 30 20 29 20 72 65 74 75 72  | r<=0.0 ) retur
4030: 6e 3b 0a 20 20 69 66 28 20 6e 3e 31 30 30 30 20  n;.  if( n>1000 
4040: 29 20 6e 20 3d 20 31 30 30 30 3b 0a 20 20 70 20  ) n = 1000;.  p 
4050: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
4060: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  64( sizeof(*p) +
4070: 20 28 6e 2d 31 29 2a 32 2a 73 69 7a 65 6f 66 28   (n-1)*2*sizeof(
4080: 47 65 6f 43 6f 6f 72 64 29 20 29 3b 0a 20 20 69  GeoCoord) );.  i
4090: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
40a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
40b0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
40c0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
40d0: 20 20 7d 0a 20 20 69 20 3d 20 31 3b 0a 20 20 70    }.  i = 1;.  p
40e0: 2d 3e 68 64 72 5b 30 5d 20 3d 20 2a 28 75 6e 73  ->hdr[0] = *(uns
40f0: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 3b 0a  igned char*)&i;.
4100: 20 20 70 2d 3e 68 64 72 5b 31 5d 20 3d 20 30 3b    p->hdr[1] = 0;
4110: 0a 20 20 70 2d 3e 68 64 72 5b 32 5d 20 3d 20 28  .  p->hdr[2] = (
4120: 6e 3e 3e 38 29 26 30 78 66 66 3b 0a 20 20 70 2d  n>>8)&0xff;.  p-
4130: 3e 68 64 72 5b 33 5d 20 3d 20 6e 26 30 78 66 66  >hdr[3] = n&0xff
4140: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
4150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62  ; i++){.    doub
4160: 6c 65 20 72 41 6e 67 6c 65 20 3d 20 32 2e 30 2a  le rAngle = 2.0*
4170: 47 45 4f 50 4f 4c 59 5f 50 49 2a 69 2f 6e 3b 0a  GEOPOLY_PI*i/n;.
4180: 20 20 20 20 70 2d 3e 61 5b 69 2a 32 5d 20 3d 20      p->a[i*2] = 
4190: 78 20 2d 20 72 2a 67 65 6f 70 6f 6c 79 43 6f 73  x - r*geopolyCos
41a0: 69 6e 65 28 72 41 6e 67 6c 65 2d 30 2e 35 2a 47  ine(rAngle-0.5*G
41b0: 45 4f 50 4f 4c 59 5f 50 49 29 3b 0a 20 20 20 20  EOPOLY_PI);.    
41c0: 70 2d 3e 61 5b 69 2a 32 2b 31 5d 20 3d 20 79 20  p->a[i*2+1] = y 
41d0: 2b 20 72 2a 67 65 6f 70 6f 6c 79 43 6f 73 69 6e  + r*geopolyCosin
41e0: 65 28 72 41 6e 67 6c 65 29 3b 0a 20 20 7d 0a 20  e(rAngle);.  }. 
41f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4200: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d  blob(context, p-
4210: 3e 68 64 72 2c 20 34 2b 38 2a 6e 2c 20 53 51 4c  >hdr, 4+8*n, SQL
4220: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  );.}../*.** If p
4250: 50 6f 6c 79 20 69 73 20 61 20 70 6f 6c 79 67 6f  Poly is a polygo
4260: 6e 2c 20 63 6f 6d 70 75 74 65 20 69 74 73 20 62  n, compute its b
4270: 6f 75 6e 64 69 6e 67 20 62 6f 78 2e 20 54 68 65  ounding box. The
4280: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  n:.**.**    (1) 
4290: 69 66 20 61 43 6f 6f 72 64 21 3d 30 20 73 74 6f  if aCoord!=0 sto
42a0: 72 65 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20  re the bounding 
42b0: 62 6f 78 20 69 6e 20 61 43 6f 6f 72 64 2c 20 72  box in aCoord, r
42c0: 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 0a 2a 2a  eturning NULL.**
42d0: 20 20 20 20 28 32 29 20 6f 74 68 65 72 77 69 73      (2) otherwis
42e0: 65 2c 20 63 6f 6d 70 75 74 65 20 61 20 47 65 6f  e, compute a Geo
42f0: 50 6f 6c 79 20 66 6f 72 20 74 68 65 20 62 6f 75  Poly for the bou
4300: 6e 64 69 6e 67 20 62 6f 78 20 61 6e 64 20 72 65  nding box and re
4310: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  turn the.**     
4320: 20 20 20 6e 65 77 20 47 65 6f 50 6f 6c 79 0a 2a     new GeoPoly.*
4330: 2a 0a 2a 2a 20 49 66 20 70 50 6f 6c 79 20 69 73  *.** If pPoly is
4340: 20 4e 55 4c 4c 20 62 75 74 20 61 43 6f 6f 72 64   NULL but aCoord
4350: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
4360: 65 6e 20 63 6f 6d 70 75 74 65 20 61 20 6e 65 77  en compute a new
4370: 20 47 65 6f 50 6f 6c 79 20 66 72 6f 6d 0a 2a 2a   GeoPoly from.**
4380: 20 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f   the bounding bo
4390: 78 20 69 6e 20 61 43 6f 6f 72 64 20 61 6e 64 20  x in aCoord and 
43a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
43b0: 20 74 6f 20 74 68 61 74 20 47 65 6f 50 6f 6c 79   to that GeoPoly
43c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 50  ..*/.static GeoP
43d0: 6f 6c 79 20 2a 67 65 6f 70 6f 6c 79 42 42 6f 78  oly *geopolyBBox
43e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
43f0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 20  ext *context,   
4400: 2f 2a 20 46 6f 72 20 72 65 63 6f 72 64 69 6e 67  /* For recording
4410: 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20   the error */.  
4420: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
4430: 50 6f 6c 79 2c 20 20 20 20 20 20 20 2f 2a 20 54  Poly,       /* T
4440: 68 65 20 70 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20  he polygon */.  
4450: 52 74 72 65 65 43 6f 6f 72 64 20 2a 61 43 6f 6f  RtreeCoord *aCoo
4460: 72 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  rd,         /* R
4470: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
4480: 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20   int *pRc       
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44a0: 45 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20  Error code here 
44b0: 2a 2f 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  */.){.  GeoPoly 
44c0: 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20 47 65 6f  *pOut = 0;.  Geo
44d0: 50 6f 6c 79 20 2a 70 3b 0a 20 20 66 6c 6f 61 74  Poly *p;.  float
44e0: 20 6d 6e 58 2c 20 6d 78 58 2c 20 6d 6e 59 2c 20   mnX, mxX, mnY, 
44f0: 6d 78 59 3b 0a 20 20 69 66 28 20 70 50 6f 6c 79  mxY;.  if( pPoly
4500: 3d 3d 30 20 26 26 20 61 43 6f 6f 72 64 21 3d 30  ==0 && aCoord!=0
4510: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
4520: 20 20 20 6d 6e 58 20 3d 20 61 43 6f 6f 72 64 5b     mnX = aCoord[
4530: 30 5d 2e 66 3b 0a 20 20 20 20 6d 78 58 20 3d 20  0].f;.    mxX = 
4540: 61 43 6f 6f 72 64 5b 31 5d 2e 66 3b 0a 20 20 20  aCoord[1].f;.   
4550: 20 6d 6e 59 20 3d 20 61 43 6f 6f 72 64 5b 32 5d   mnY = aCoord[2]
4560: 2e 66 3b 0a 20 20 20 20 6d 78 59 20 3d 20 61 43  .f;.    mxY = aC
4570: 6f 6f 72 64 5b 33 5d 2e 66 3b 0a 20 20 20 20 67  oord[3].f;.    g
4580: 6f 74 6f 20 67 65 6f 70 6f 6c 79 42 62 6f 78 46  oto geopolyBboxF
4590: 69 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ill;.  }else{.  
45a0: 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e    p = geopolyFun
45b0: 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20  cParam(context, 
45c0: 70 50 6f 6c 79 2c 20 70 52 63 29 3b 0a 20 20 7d  pPoly, pRc);.  }
45d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
45e0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 6d 6e 58 20  int ii;.    mnX 
45f0: 3d 20 6d 78 58 20 3d 20 70 2d 3e 61 5b 30 5d 3b  = mxX = p->a[0];
4600: 0a 20 20 20 20 6d 6e 59 20 3d 20 6d 78 59 20 3d  .    mnY = mxY =
4610: 20 70 2d 3e 61 5b 31 5d 3b 0a 20 20 20 20 66 6f   p->a[1];.    fo
4620: 72 28 69 69 3d 31 3b 20 69 69 3c 70 2d 3e 6e 56  r(ii=1; ii<p->nV
4630: 65 72 74 65 78 3b 20 69 69 2b 2b 29 7b 0a 20 20  ertex; ii++){.  
4640: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 70      double r = p
4650: 2d 3e 61 5b 69 69 2a 32 5d 3b 0a 20 20 20 20 20  ->a[ii*2];.     
4660: 20 69 66 28 20 72 3c 6d 6e 58 20 29 20 6d 6e 58   if( r<mnX ) mnX
4670: 20 3d 20 28 66 6c 6f 61 74 29 72 3b 0a 20 20 20   = (float)r;.   
4680: 20 20 20 65 6c 73 65 20 69 66 28 20 72 3e 6d 78     else if( r>mx
4690: 58 20 29 20 6d 78 58 20 3d 20 28 66 6c 6f 61 74  X ) mxX = (float
46a0: 29 72 3b 0a 20 20 20 20 20 20 72 20 3d 20 70 2d  )r;.      r = p-
46b0: 3e 61 5b 69 69 2a 32 2b 31 5d 3b 0a 20 20 20 20  >a[ii*2+1];.    
46c0: 20 20 69 66 28 20 72 3c 6d 6e 59 20 29 20 6d 6e    if( r<mnY ) mn
46d0: 59 20 3d 20 28 66 6c 6f 61 74 29 72 3b 0a 20 20  Y = (float)r;.  
46e0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 72 3e 6d      else if( r>m
46f0: 78 59 20 29 20 6d 78 59 20 3d 20 28 66 6c 6f 61  xY ) mxY = (floa
4700: 74 29 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t)r;.    }.    i
4710: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
4720: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
4730: 66 28 20 61 43 6f 6f 72 64 3d 3d 30 20 29 7b 0a  f( aCoord==0 ){.
4740: 20 20 20 20 20 20 67 65 6f 70 6f 6c 79 42 62 6f        geopolyBbo
4750: 78 46 69 6c 6c 3a 0a 20 20 20 20 20 20 70 4f 75  xFill:.      pOu
4760: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
4770: 6c 6f 63 28 70 2c 20 47 45 4f 50 4f 4c 59 5f 53  loc(p, GEOPOLY_S
4780: 5a 28 34 29 29 3b 0a 20 20 20 20 20 20 69 66 28  Z(4));.      if(
4790: 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pOut==0 ){.    
47a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
47b0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
47c0: 20 63 6f 6e 74 65 78 74 20 29 20 73 71 6c 69 74   context ) sqlit
47d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
47e0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
47f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 63 20          if( pRc 
4800: 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f  ) *pRc = SQLITE_
4810: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72  NOMEM;.        r
4820: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
4830: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 56 65  .      pOut->nVe
4840: 72 74 65 78 20 3d 20 34 3b 0a 20 20 20 20 20 20  rtex = 4;.      
4850: 69 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ii = 1;.      pO
4860: 75 74 2d 3e 68 64 72 5b 30 5d 20 3d 20 2a 28 75  ut->hdr[0] = *(u
4870: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69  nsigned char*)&i
4880: 69 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68  i;.      pOut->h
4890: 64 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dr[1] = 0;.     
48a0: 20 70 4f 75 74 2d 3e 68 64 72 5b 32 5d 20 3d 20   pOut->hdr[2] = 
48b0: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68  0;.      pOut->h
48c0: 64 72 5b 33 5d 20 3d 20 34 3b 0a 20 20 20 20 20  dr[3] = 4;.     
48d0: 20 70 4f 75 74 2d 3e 61 5b 30 5d 20 3d 20 6d 6e   pOut->a[0] = mn
48e0: 58 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  X;.      pOut->a
48f0: 5b 31 5d 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20  [1] = mnY;.     
4900: 20 70 4f 75 74 2d 3e 61 5b 32 5d 20 3d 20 6d 78   pOut->a[2] = mx
4910: 58 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  X;.      pOut->a
4920: 5b 33 5d 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20  [3] = mnY;.     
4930: 20 70 4f 75 74 2d 3e 61 5b 34 5d 20 3d 20 6d 78   pOut->a[4] = mx
4940: 58 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  X;.      pOut->a
4950: 5b 35 5d 20 3d 20 6d 78 59 3b 0a 20 20 20 20 20  [5] = mxY;.     
4960: 20 70 4f 75 74 2d 3e 61 5b 36 5d 20 3d 20 6d 6e   pOut->a[6] = mn
4970: 58 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61  X;.      pOut->a
4980: 5b 37 5d 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d  [7] = mxY;.    }
4990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
49a0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
49b0: 20 20 20 61 43 6f 6f 72 64 5b 30 5d 2e 66 20 3d     aCoord[0].f =
49c0: 20 6d 6e 58 3b 0a 20 20 20 20 20 20 61 43 6f 6f   mnX;.      aCoo
49d0: 72 64 5b 31 5d 2e 66 20 3d 20 6d 78 58 3b 0a 20  rd[1].f = mxX;. 
49e0: 20 20 20 20 20 61 43 6f 6f 72 64 5b 32 5d 2e 66       aCoord[2].f
49f0: 20 3d 20 6d 6e 59 3b 0a 20 20 20 20 20 20 61 43   = mnY;.      aC
4a00: 6f 6f 72 64 5b 33 5d 2e 66 20 3d 20 6d 78 59 3b  oord[3].f = mxY;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4a20: 75 72 6e 20 70 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pOut;.}../*.
4a30: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4a40: 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  n of the geopoly
4a50: 5f 62 62 6f 78 28 58 29 20 53 51 4c 20 66 75 6e  _bbox(X) SQL fun
4a60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4a70: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f   void geopolyBBo
4a80: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
4a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4aa0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
4ab0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4ac0: 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f  *argv.){.  GeoPo
4ad0: 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f 6c 79 42  ly *p = geopolyB
4ae0: 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  Box(context, arg
4af0: 76 5b 30 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 69  v[0], 0, 0);.  i
4b00: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
4b10: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
4b20: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64 72 2c  context, p->hdr,
4b30: 20 0a 20 20 20 20 20 20 20 34 2b 38 2a 70 2d 3e   .       4+8*p->
4b40: 6e 56 65 72 74 65 78 2c 20 53 51 4c 49 54 45 5f  nVertex, SQLITE_
4b50: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
4b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
4b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
4b80: 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20 74  ate vector for t
4b90: 68 65 20 67 65 6f 70 6f 6c 79 5f 67 72 6f 75 70  he geopoly_group
4ba0: 5f 62 62 6f 78 28 29 20 61 67 67 72 65 67 61 74  _bbox() aggregat
4bb0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74  e function..*/.t
4bc0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65  ypedef struct Ge
4bd0: 6f 42 42 6f 78 20 47 65 6f 42 42 6f 78 3b 0a 73  oBBox GeoBBox;.s
4be0: 74 72 75 63 74 20 47 65 6f 42 42 6f 78 20 7b 0a  truct GeoBBox {.
4bf0: 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20    int isInit;.  
4c00: 52 74 72 65 65 43 6f 6f 72 64 20 61 5b 34 5d 3b  RtreeCoord a[4];
4c10: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  .};.../*.** Impl
4c20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
4c30: 65 20 67 65 6f 70 6f 6c 79 5f 67 72 6f 75 70 5f  e geopoly_group_
4c40: 62 62 6f 78 28 58 29 20 61 67 67 72 65 67 61 74  bbox(X) aggregat
4c50: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a  e SQL function..
4c60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
4c70: 65 6f 70 6f 6c 79 42 42 6f 78 53 74 65 70 28 0a  eopolyBBoxStep(.
4c80: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4c90: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4ca0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
4cb0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4cc0: 7b 0a 20 20 52 74 72 65 65 43 6f 6f 72 64 20 61  {.  RtreeCoord a
4cd0: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
4ce0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 28 76 6f  SQLITE_OK;.  (vo
4cf0: 69 64 29 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63  id)geopolyBBox(c
4d00: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c  ontext, argv[0],
4d10: 20 61 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20   a, &rc);.  if( 
4d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4d30: 0a 20 20 20 20 47 65 6f 42 42 6f 78 20 2a 70 42  .    GeoBBox *pB
4d40: 42 6f 78 3b 0a 20 20 20 20 70 42 42 6f 78 20 3d  Box;.    pBBox =
4d50: 20 28 47 65 6f 42 42 6f 78 2a 29 73 71 6c 69 74   (GeoBBox*)sqlit
4d60: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
4d70: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
4d80: 7a 65 6f 66 28 2a 70 42 42 6f 78 29 29 3b 0a 20  zeof(*pBBox));. 
4d90: 20 20 20 69 66 28 20 70 42 42 6f 78 3d 3d 30 20     if( pBBox==0 
4da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
4db0: 28 20 70 42 42 6f 78 2d 3e 69 73 49 6e 69 74 3d  ( pBBox->isInit=
4dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 42 6f  =0 ){.      pBBo
4dd0: 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  x->isInit = 1;. 
4de0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 42 6f       memcpy(pBBo
4df0: 78 2d 3e 61 2c 20 61 2c 20 73 69 7a 65 6f 66 28  x->a, a, sizeof(
4e00: 52 74 72 65 65 43 6f 6f 72 64 29 2a 34 29 3b 0a  RtreeCoord)*4);.
4e10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e20: 20 69 66 28 20 61 5b 30 5d 2e 66 20 3c 20 70 42   if( a[0].f < pB
4e30: 42 6f 78 2d 3e 61 5b 30 5d 2e 66 20 29 20 70 42  Box->a[0].f ) pB
4e40: 42 6f 78 2d 3e 61 5b 30 5d 20 3d 20 61 5b 30 5d  Box->a[0] = a[0]
4e50: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d  ;.      if( a[1]
4e60: 2e 66 20 3e 20 70 42 42 6f 78 2d 3e 61 5b 31 5d  .f > pBBox->a[1]
4e70: 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 31 5d  .f ) pBBox->a[1]
4e80: 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 69   = a[1];.      i
4e90: 66 28 20 61 5b 32 5d 2e 66 20 3c 20 70 42 42 6f  f( a[2].f < pBBo
4ea0: 78 2d 3e 61 5b 32 5d 2e 66 20 29 20 70 42 42 6f  x->a[2].f ) pBBo
4eb0: 78 2d 3e 61 5b 32 5d 20 3d 20 61 5b 32 5d 3b 0a  x->a[2] = a[2];.
4ec0: 20 20 20 20 20 20 69 66 28 20 61 5b 33 5d 2e 66        if( a[3].f
4ed0: 20 3e 20 70 42 42 6f 78 2d 3e 61 5b 33 5d 2e 66   > pBBox->a[3].f
4ee0: 20 29 20 70 42 42 6f 78 2d 3e 61 5b 33 5d 20 3d   ) pBBox->a[3] =
4ef0: 20 61 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   a[3];.    }.  }
4f00: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  .}.static void g
4f10: 65 6f 70 6f 6c 79 42 42 6f 78 46 69 6e 61 6c 28  eopolyBBoxFinal(
4f20: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4f30: 78 74 20 2a 63 6f 6e 74 65 78 74 0a 29 7b 0a 20  xt *context.){. 
4f40: 20 47 65 6f 50 6f 6c 79 20 2a 70 3b 0a 20 20 47   GeoPoly *p;.  G
4f50: 65 6f 42 42 6f 78 20 2a 70 42 42 6f 78 3b 0a 20  eoBBox *pBBox;. 
4f60: 20 70 42 42 6f 78 20 3d 20 28 47 65 6f 42 42 6f   pBBox = (GeoBBo
4f70: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
4f80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
4f90: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
4fa0: 70 42 42 6f 78 3d 3d 30 20 29 20 72 65 74 75 72  pBBox==0 ) retur
4fb0: 6e 3b 0a 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79  n;.  p = geopoly
4fc0: 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20 30 2c  BBox(context, 0,
4fd0: 20 70 42 42 6f 78 2d 3e 61 2c 20 30 29 3b 0a 20   pBBox->a, 0);. 
4fe0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
4ff0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
5000: 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 68 64  b(context, p->hd
5010: 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38 2a 70  r, .       4+8*p
5020: 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c 49 54  ->nVertex, SQLIT
5030: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5040: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5050: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5060: 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 70 6f   Determine if po
5070: 69 6e 74 20 28 78 30 2c 79 30 29 20 69 73 20 62  int (x0,y0) is b
5080: 65 6e 65 61 74 68 20 6c 69 6e 65 20 73 65 67 6d  eneath line segm
5090: 65 6e 74 20 28 78 31 2c 79 31 29 2d 3e 28 78 32  ent (x1,y1)->(x2
50a0: 2c 79 32 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 73  ,y2)..** Returns
50b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 32 20 20 78  :.**.**    +2  x
50c0: 30 2c 79 30 20 69 73 20 6f 6e 20 74 68 65 20 6c  0,y0 is on the l
50d0: 69 6e 65 20 73 65 67 65 6d 65 6e 74 0a 2a 2a 0a  ine segement.**.
50e0: 2a 2a 20 20 20 20 2b 31 20 20 78 30 2c 79 30 20  **    +1  x0,y0 
50f0: 69 73 20 62 65 6e 65 61 74 68 20 6c 69 6e 65 20  is beneath line 
5100: 73 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20  segment.**.**   
5110: 20 30 20 20 20 78 30 2c 79 30 20 69 73 20 6e 6f   0   x0,y0 is no
5120: 74 20 6f 6e 20 6f 72 20 62 65 6e 65 61 74 68 20  t on or beneath 
5130: 74 68 65 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74  the line segment
5140: 20 6f 72 20 74 68 65 20 6c 69 6e 65 20 73 65 67   or the line seg
5150: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 69  ment.**        i
5160: 73 20 76 65 72 74 69 63 61 6c 20 61 6e 64 20 78  s vertical and x
5170: 30 2c 79 30 20 69 73 20 6e 6f 74 20 6f 6e 20 74  0,y0 is not on t
5180: 68 65 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a  he line segment.
5190: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
51a0: 6f 73 74 20 63 6f 6f 72 64 69 6e 61 74 65 20 6d  ost coordinate m
51b0: 69 6e 28 78 31 2c 78 32 29 20 69 73 20 6e 6f 74  in(x1,x2) is not
51c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
51d0: 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
51e0: 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 20 66 6f   line segment fo
51f0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
5200: 66 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 2e  f this analysis.
5210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5220: 6f 69 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65 28  ointBeneathLine(
5230: 0a 20 20 64 6f 75 62 6c 65 20 78 30 2c 20 64 6f  .  double x0, do
5240: 75 62 6c 65 20 79 30 2c 0a 20 20 64 6f 75 62 6c  uble y0,.  doubl
5250: 65 20 78 31 2c 20 64 6f 75 62 6c 65 20 79 31 2c  e x1, double y1,
5260: 0a 20 20 64 6f 75 62 6c 65 20 78 32 2c 20 64 6f  .  double x2, do
5270: 75 62 6c 65 20 79 32 0a 29 7b 0a 20 20 64 6f 75  uble y2.){.  dou
5280: 62 6c 65 20 79 3b 0a 20 20 69 66 28 20 78 30 3d  ble y;.  if( x0=
5290: 3d 78 31 20 26 26 20 79 30 3d 3d 79 31 20 29 20  =x1 && y0==y1 ) 
52a0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
52b0: 78 31 3c 78 32 20 29 7b 0a 20 20 20 20 69 66 28  x1<x2 ){.    if(
52c0: 20 78 30 3c 3d 78 31 20 7c 7c 20 78 30 3e 78 32   x0<=x1 || x0>x2
52d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
52e0: 65 6c 73 65 20 69 66 28 20 78 31 3e 78 32 20 29  else if( x1>x2 )
52f0: 7b 0a 20 20 20 20 69 66 28 20 78 30 3c 3d 78 32  {.    if( x0<=x2
5300: 20 7c 7c 20 78 30 3e 78 31 20 29 20 72 65 74 75   || x0>x1 ) retu
5310: 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
5320: 20 20 20 2f 2a 20 56 65 72 74 69 63 61 6c 20 6c     /* Vertical l
5330: 69 6e 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ine segment */. 
5340: 20 20 20 69 66 28 20 78 30 21 3d 78 31 20 29 20     if( x0!=x1 ) 
5350: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
5360: 28 20 79 30 3c 79 31 20 26 26 20 79 30 3c 79 32  ( y0<y1 && y0<y2
5370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5380: 20 69 66 28 20 79 30 3e 79 31 20 26 26 20 79 30   if( y0>y1 && y0
5390: 3e 79 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >y2 ) return 0;.
53a0: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
53b0: 7d 0a 20 20 79 20 3d 20 79 31 20 2b 20 28 79 32  }.  y = y1 + (y2
53c0: 2d 79 31 29 2a 28 78 30 2d 78 31 29 2f 28 78 32  -y1)*(x0-x1)/(x2
53d0: 2d 78 31 29 3b 0a 20 20 69 66 28 20 79 30 3d 3d  -x1);.  if( y0==
53e0: 79 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  y ) return 2;.  
53f0: 69 66 28 20 79 30 3c 79 20 29 20 72 65 74 75 72  if( y0<y ) retur
5400: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
5410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
5420: 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65 6f 70 6f  nction:    geopo
5430: 6c 79 5f 63 6f 6e 74 61 69 6e 73 5f 70 6f 69 6e  ly_contains_poin
5440: 74 28 50 2c 58 2c 59 29 0a 2a 2a 0a 2a 2a 20 52  t(P,X,Y).**.** R
5450: 65 74 75 72 6e 20 2b 32 20 69 66 20 70 6f 69 6e  eturn +2 if poin
5460: 74 20 58 2c 59 20 69 73 20 77 69 74 68 69 6e 20  t X,Y is within 
5470: 70 6f 6c 79 67 6f 6e 20 50 2e 0a 2a 2a 20 52 65  polygon P..** Re
5480: 74 75 72 6e 20 2b 31 20 69 66 20 70 6f 69 6e 74  turn +1 if point
5490: 20 58 2c 59 20 69 73 20 6f 6e 20 74 68 65 20 70   X,Y is on the p
54a0: 6f 6c 79 67 6f 6e 20 62 6f 75 6e 64 61 72 79 2e  olygon boundary.
54b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
54c0: 70 6f 69 6e 74 20 58 2c 59 20 69 73 20 6f 75 74  point X,Y is out
54d0: 73 69 64 65 20 74 68 65 20 70 6f 6c 79 67 6f 6e  side the polygon
54e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
54f0: 67 65 6f 70 6f 6c 79 43 6f 6e 74 61 69 6e 73 50  geopolyContainsP
5500: 6f 69 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  ointFunc(.  sqli
5510: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5520: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5530: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5540: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65  e **argv.){.  Ge
5550: 6f 50 6f 6c 79 20 2a 70 31 20 3d 20 67 65 6f 70  oPoly *p1 = geop
5560: 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e  olyFuncParam(con
5570: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30  text, argv[0], 0
5580: 29 3b 0a 20 20 64 6f 75 62 6c 65 20 78 30 20 3d  );.  double x0 =
5590: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
55a0: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 3b 0a  ouble(argv[1]);.
55b0: 20 20 64 6f 75 62 6c 65 20 79 30 20 3d 20 73 71    double y0 = sq
55c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
55d0: 6c 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69  le(argv[2]);.  i
55e0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt v = 0;.  int 
55f0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  cnt = 0;.  int i
5600: 69 3b 0a 20 20 69 66 28 20 70 31 3d 3d 30 20 29  i;.  if( p1==0 )
5610: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
5620: 69 3d 30 3b 20 69 69 3c 70 31 2d 3e 6e 56 65 72  i=0; ii<p1->nVer
5630: 74 65 78 2d 31 3b 20 69 69 2b 2b 29 7b 0a 20 20  tex-1; ii++){.  
5640: 20 20 76 20 3d 20 70 6f 69 6e 74 42 65 6e 65 61    v = pointBenea
5650: 74 68 4c 69 6e 65 28 78 30 2c 79 30 2c 70 31 2d  thLine(x0,y0,p1-
5660: 3e 61 5b 69 69 2a 32 5d 2c 70 31 2d 3e 61 5b 69  >a[ii*2],p1->a[i
5670: 69 2a 32 2b 31 5d 2c 0a 20 20 20 20 20 20 20 20  i*2+1],.        
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 20 20 70 31 2d 3e 61 5b 69 69 2a         p1->a[ii*
56a0: 32 2b 32 5d 2c 70 31 2d 3e 61 5b 69 69 2a 32 2b  2+2],p1->a[ii*2+
56b0: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  3]);.    if( v==
56c0: 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  2 ) break;.    c
56d0: 6e 74 20 2b 3d 20 76 3b 0a 20 20 7d 0a 20 20 69  nt += v;.  }.  i
56e0: 66 28 20 76 21 3d 32 20 29 7b 0a 20 20 20 20 76  f( v!=2 ){.    v
56f0: 20 3d 20 70 6f 69 6e 74 42 65 6e 65 61 74 68 4c   = pointBeneathL
5700: 69 6e 65 28 78 30 2c 79 30 2c 70 31 2d 3e 61 5b  ine(x0,y0,p1->a[
5710: 69 69 2a 32 5d 2c 70 31 2d 3e 61 5b 69 69 2a 32  ii*2],p1->a[ii*2
5720: 2b 31 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  +1],.           
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 70 31 2d 3e 61 5b 30 5d 2c 70 31 2d      p1->a[0],p1-
5750: 3e 61 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  >a[1]);.  }.  if
5760: 28 20 76 3d 3d 32 20 29 7b 0a 20 20 20 20 73 71  ( v==2 ){.    sq
5770: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5780: 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20  (context, 1);.  
5790: 7d 65 6c 73 65 20 69 66 28 20 28 28 76 2b 63 6e  }else if( ((v+cn
57a0: 74 29 26 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t)&1)==0 ){.    
57b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
57c0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  nt(context, 0);.
57d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
57e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
57f0: 63 6f 6e 74 65 78 74 2c 20 32 29 3b 0a 20 20 7d  context, 2);.  }
5800: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5810: 70 31 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  p1);.}../* Forwa
5820: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
5830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
5840: 70 6f 6c 79 4f 76 65 72 6c 61 70 28 47 65 6f 50  polyOverlap(GeoP
5850: 6f 6c 79 20 2a 70 31 2c 20 47 65 6f 50 6f 6c 79  oly *p1, GeoPoly
5860: 20 2a 70 32 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 51   *p2);../*.** SQ
5870: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67  L function:    g
5880: 65 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 50 31  eopoly_within(P1
5890: 2c 50 32 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ,P2).**.** Retur
58a0: 6e 20 2b 32 20 69 66 20 50 31 20 61 6e 64 20 50  n +2 if P1 and P
58b0: 32 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  2 are the same p
58c0: 6f 6c 79 67 6f 6e 0a 2a 2a 20 52 65 74 75 72 6e  olygon.** Return
58d0: 20 2b 31 20 69 66 20 50 32 20 69 73 20 63 6f 6e   +1 if P2 is con
58e0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 50 31  tained within P1
58f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
5900: 61 6e 79 20 70 61 72 74 20 6f 66 20 50 32 20 69  any part of P2 i
5910: 73 20 6f 6e 20 74 68 65 20 6f 75 74 73 69 64 65  s on the outside
5920: 20 6f 66 20 50 31 0a 2a 2a 0a 2a 2f 0a 73 74 61   of P1.**.*/.sta
5930: 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79  tic void geopoly
5940: 57 69 74 68 69 6e 46 75 6e 63 28 0a 20 20 73 71  WithinFunc(.  sq
5950: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5960: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5970: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5980: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5990: 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d 20 67 65  GeoPoly *p1 = ge
59a0: 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63  opolyFuncParam(c
59b0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c  ontext, argv[0],
59c0: 20 30 29 3b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a   0);.  GeoPoly *
59d0: 70 32 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  p2 = geopolyFunc
59e0: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
59f0: 72 67 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  rgv[1], 0);.  if
5a00: 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a 20 20  ( p1 && p2 ){.  
5a10: 20 20 69 6e 74 20 78 20 3d 20 67 65 6f 70 6f 6c    int x = geopol
5a20: 79 4f 76 65 72 6c 61 70 28 70 31 2c 20 70 32 29  yOverlap(p1, p2)
5a30: 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20 29 7b  ;.    if( x<0 ){
5a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5a50: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
5a60: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
5a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
5a80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
5a90: 63 6f 6e 74 65 78 74 2c 20 78 3d 3d 32 20 3f 20  context, x==2 ? 
5aa0: 31 20 3a 20 78 3d 3d 34 20 3f 20 32 20 3a 20 30  1 : x==4 ? 2 : 0
5ab0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
5ac0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 31 29 3b  qlite3_free(p1);
5ad0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5ae0: 70 32 29 3b 0a 7d 0a 0a 2f 2a 20 4f 62 6a 65 63  p2);.}../* Objec
5af0: 74 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  ts used by the o
5b00: 76 65 72 6c 61 70 20 61 6c 67 6f 72 69 68 6d 2e  verlap algorihm.
5b10: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
5b20: 63 74 20 47 65 6f 45 76 65 6e 74 20 47 65 6f 45  ct GeoEvent GeoE
5b30: 76 65 6e 74 3b 0a 74 79 70 65 64 65 66 20 73 74  vent;.typedef st
5b40: 72 75 63 74 20 47 65 6f 53 65 67 6d 65 6e 74 20  ruct GeoSegment 
5b50: 47 65 6f 53 65 67 6d 65 6e 74 3b 0a 74 79 70 65  GeoSegment;.type
5b60: 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 4f 76  def struct GeoOv
5b70: 65 72 6c 61 70 20 47 65 6f 4f 76 65 72 6c 61 70  erlap GeoOverlap
5b80: 3b 0a 73 74 72 75 63 74 20 47 65 6f 45 76 65 6e  ;.struct GeoEven
5b90: 74 20 7b 0a 20 20 64 6f 75 62 6c 65 20 78 3b 20  t {.  double x; 
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bb0: 58 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 74 20  X coordinate at 
5bc0: 77 68 69 63 68 20 65 76 65 6e 74 20 6f 63 63 75  which event occu
5bd0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  rs */.  int eTyp
5be0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
5bf0: 2a 20 30 20 66 6f 72 20 41 44 44 2c 20 31 20 66  * 0 for ADD, 1 f
5c00: 6f 72 20 52 45 4d 4f 56 45 20 2a 2f 0a 20 20 47  or REMOVE */.  G
5c10: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  eoSegment *pSeg;
5c20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 67        /* The seg
5c30: 6d 65 6e 74 20 74 6f 20 62 65 20 61 64 64 65 64  ment to be added
5c40: 20 6f 72 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20   or removed */. 
5c50: 20 47 65 6f 45 76 65 6e 74 20 2a 70 4e 65 78 74   GeoEvent *pNext
5c60: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
5c70: 65 76 65 6e 74 20 69 6e 20 74 68 65 20 73 6f 72  event in the sor
5c80: 74 65 64 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 73  ted list */.};.s
5c90: 74 72 75 63 74 20 47 65 6f 53 65 67 6d 65 6e 74  truct GeoSegment
5ca0: 20 7b 0a 20 20 64 6f 75 62 6c 65 20 43 2c 20 42   {.  double C, B
5cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 79  ;           /* y
5cc0: 20 3d 20 43 2a 78 20 2b 20 42 20 2a 2f 0a 20 20   = C*x + B */.  
5cd0: 64 6f 75 62 6c 65 20 79 3b 20 20 20 20 20 20 20  double y;       
5ce0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
5cf0: 74 20 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 66  t y value */.  f
5d00: 6c 6f 61 74 20 79 30 3b 20 20 20 20 20 20 20 20  loat y0;        
5d10: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
5d20: 20 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 6e   y value */.  un
5d30: 73 69 67 6e 65 64 20 63 68 61 72 20 73 69 64 65  signed char side
5d40: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 70 31  ;    /* 1 for p1
5d50: 2c 20 32 20 66 6f 72 20 70 32 20 2a 2f 0a 20 20  , 2 for p2 */.  
5d60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78  unsigned int idx
5d70: 3b 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  ;      /* Which 
5d80: 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 74  segment within t
5d90: 68 65 20 73 69 64 65 20 2a 2f 0a 20 20 47 65 6f  he side */.  Geo
5da0: 53 65 67 6d 65 6e 74 20 2a 70 4e 65 78 74 3b 20  Segment *pNext; 
5db0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 65 67 6d      /* Next segm
5dc0: 65 6e 74 20 69 6e 20 61 20 6c 69 73 74 20 73 6f  ent in a list so
5dd0: 72 74 65 64 20 62 79 20 79 20 2a 2f 0a 7d 3b 0a  rted by y */.};.
5de0: 73 74 72 75 63 74 20 47 65 6f 4f 76 65 72 6c 61  struct GeoOverla
5df0: 70 20 7b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a  p {.  GeoEvent *
5e00: 61 45 76 65 6e 74 3b 20 20 20 20 20 20 20 20 20  aEvent;         
5e10: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c   /* Array of all
5e20: 20 65 76 65 6e 74 73 20 2a 2f 0a 20 20 47 65 6f   events */.  Geo
5e30: 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 6d 65 6e  Segment *aSegmen
5e40: 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  t;      /* Array
5e50: 20 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   of all segments
5e60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 76 65 6e 74   */.  int nEvent
5e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5e80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 76   /* Number of ev
5e90: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ents */.  int nS
5ea0: 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20  egment;         
5eb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5ec0: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 7d 3b  f segments */.};
5ed0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
5ee0: 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 61 6e 64  ngle segment and
5ef0: 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 20   its associated 
5f00: 65 76 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  events..*/.stati
5f10: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64  c void geopolyAd
5f20: 64 4f 6e 65 53 65 67 6d 65 6e 74 28 0a 20 20 47  dOneSegment(.  G
5f30: 65 6f 4f 76 65 72 6c 61 70 20 2a 70 2c 0a 20 20  eoOverlap *p,.  
5f40: 47 65 6f 43 6f 6f 72 64 20 78 30 2c 0a 20 20 47  GeoCoord x0,.  G
5f50: 65 6f 43 6f 6f 72 64 20 79 30 2c 0a 20 20 47 65  eoCoord y0,.  Ge
5f60: 6f 43 6f 6f 72 64 20 78 31 2c 0a 20 20 47 65 6f  oCoord x1,.  Geo
5f70: 43 6f 6f 72 64 20 79 31 2c 0a 20 20 75 6e 73 69  Coord y1,.  unsi
5f80: 67 6e 65 64 20 63 68 61 72 20 73 69 64 65 2c 0a  gned char side,.
5f90: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
5fa0: 64 78 0a 29 7b 0a 20 20 47 65 6f 53 65 67 6d 65  dx.){.  GeoSegme
5fb0: 6e 74 20 2a 70 53 65 67 3b 0a 20 20 47 65 6f 45  nt *pSeg;.  GeoE
5fc0: 76 65 6e 74 20 2a 70 45 76 65 6e 74 3b 0a 20 20  vent *pEvent;.  
5fd0: 69 66 28 20 78 30 3d 3d 78 31 20 29 20 72 65 74  if( x0==x1 ) ret
5fe0: 75 72 6e 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  urn;  /* Ignore 
5ff0: 76 65 72 74 69 63 61 6c 20 73 65 67 6d 65 6e 74  vertical segment
6000: 73 20 2a 2f 0a 20 20 69 66 28 20 78 30 3e 78 31  s */.  if( x0>x1
6010: 20 29 7b 0a 20 20 20 20 47 65 6f 43 6f 6f 72 64   ){.    GeoCoord
6020: 20 74 20 3d 20 78 30 3b 0a 20 20 20 20 78 30 20   t = x0;.    x0 
6030: 3d 20 78 31 3b 0a 20 20 20 20 78 31 20 3d 20 74  = x1;.    x1 = t
6040: 3b 0a 20 20 20 20 74 20 3d 20 79 30 3b 0a 20 20  ;.    t = y0;.  
6050: 20 20 79 30 20 3d 20 79 31 3b 0a 20 20 20 20 79    y0 = y1;.    y
6060: 31 20 3d 20 74 3b 0a 20 20 7d 0a 20 20 70 53 65  1 = t;.  }.  pSe
6070: 67 20 3d 20 70 2d 3e 61 53 65 67 6d 65 6e 74 20  g = p->aSegment 
6080: 2b 20 70 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  + p->nSegment;. 
6090: 20 70 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a   p->nSegment++;.
60a0: 20 20 70 53 65 67 2d 3e 43 20 3d 20 28 79 31 2d    pSeg->C = (y1-
60b0: 79 30 29 2f 28 78 31 2d 78 30 29 3b 0a 20 20 70  y0)/(x1-x0);.  p
60c0: 53 65 67 2d 3e 42 20 3d 20 79 31 20 2d 20 78 31  Seg->B = y1 - x1
60d0: 2a 70 53 65 67 2d 3e 43 3b 0a 20 20 70 53 65 67  *pSeg->C;.  pSeg
60e0: 2d 3e 79 30 20 3d 20 79 30 3b 0a 20 20 70 53 65  ->y0 = y0;.  pSe
60f0: 67 2d 3e 73 69 64 65 20 3d 20 73 69 64 65 3b 0a  g->side = side;.
6100: 20 20 70 53 65 67 2d 3e 69 64 78 20 3d 20 69 64    pSeg->idx = id
6110: 78 3b 0a 20 20 70 45 76 65 6e 74 20 3d 20 70 2d  x;.  pEvent = p-
6120: 3e 61 45 76 65 6e 74 20 2b 20 70 2d 3e 6e 45 76  >aEvent + p->nEv
6130: 65 6e 74 3b 0a 20 20 70 2d 3e 6e 45 76 65 6e 74  ent;.  p->nEvent
6140: 2b 2b 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 78 20  ++;.  pEvent->x 
6150: 3d 20 78 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e  = x0;.  pEvent->
6160: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 45 76  eType = 0;.  pEv
6170: 65 6e 74 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ent->pSeg = pSeg
6180: 3b 0a 20 20 70 45 76 65 6e 74 20 3d 20 70 2d 3e  ;.  pEvent = p->
6190: 61 45 76 65 6e 74 20 2b 20 70 2d 3e 6e 45 76 65  aEvent + p->nEve
61a0: 6e 74 3b 0a 20 20 70 2d 3e 6e 45 76 65 6e 74 2b  nt;.  p->nEvent+
61b0: 2b 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 78 20 3d  +;.  pEvent->x =
61c0: 20 78 31 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 65   x1;.  pEvent->e
61d0: 54 79 70 65 20 3d 20 31 3b 0a 20 20 70 45 76 65  Type = 1;.  pEve
61e0: 6e 74 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  nt->pSeg = pSeg;
61f0: 0a 7d 0a 20 20 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .}.  .../*.** In
6200: 73 65 72 74 20 61 6c 6c 20 73 65 67 6d 65 6e 74  sert all segment
6210: 73 20 61 6e 64 20 65 76 65 6e 74 73 20 66 6f 72  s and events for
6220: 20 70 6f 6c 79 67 6f 6e 20 70 50 6f 6c 79 2e 0a   polygon pPoly..
6230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6240: 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e 74  eopolyAddSegment
6250: 73 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70 20  s(.  GeoOverlap 
6260: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *p,          /* 
6270: 41 64 64 20 73 65 67 6d 65 6e 74 73 20 74 6f 20  Add segments to 
6280: 74 68 69 73 20 4f 76 65 72 6c 61 70 20 6f 62 6a  this Overlap obj
6290: 65 63 74 20 2a 2f 0a 20 20 47 65 6f 50 6f 6c 79  ect */.  GeoPoly
62a0: 20 2a 70 50 6f 6c 79 2c 20 20 20 20 20 20 20 20   *pPoly,        
62b0: 20 2f 2a 20 54 61 6b 65 20 61 6c 6c 20 73 65 67   /* Take all seg
62c0: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
62d0: 70 6f 6c 79 67 6f 6e 20 2a 2f 0a 20 20 75 6e 73  polygon */.  uns
62e0: 69 67 6e 65 64 20 63 68 61 72 20 73 69 64 65 20  igned char side 
62f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 69 64 65       /* The side
6300: 20 6f 66 20 70 50 6f 6c 79 20 2a 2f 0a 29 7b 0a   of pPoly */.){.
6310: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6320: 3b 0a 20 20 47 65 6f 43 6f 6f 72 64 20 2a 78 3b  ;.  GeoCoord *x;
6330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 75  .  for(i=0; i<(u
6340: 6e 73 69 67 6e 65 64 29 70 50 6f 6c 79 2d 3e 6e  nsigned)pPoly->n
6350: 56 65 72 74 65 78 2d 31 3b 20 69 2b 2b 29 7b 0a  Vertex-1; i++){.
6360: 20 20 20 20 78 20 3d 20 70 50 6f 6c 79 2d 3e 61      x = pPoly->a
6370: 20 2b 20 28 69 2a 32 29 3b 0a 20 20 20 20 67 65   + (i*2);.    ge
6380: 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65  opolyAddOneSegme
6390: 6e 74 28 70 2c 20 78 5b 30 5d 2c 20 78 5b 31 5d  nt(p, x[0], x[1]
63a0: 2c 20 78 5b 32 5d 2c 20 78 5b 33 5d 2c 20 73 69  , x[2], x[3], si
63b0: 64 65 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 78 20  de, i);.  }.  x 
63c0: 3d 20 70 50 6f 6c 79 2d 3e 61 20 2b 20 28 69 2a  = pPoly->a + (i*
63d0: 32 29 3b 0a 20 20 67 65 6f 70 6f 6c 79 41 64 64  2);.  geopolyAdd
63e0: 4f 6e 65 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b  OneSegment(p, x[
63f0: 30 5d 2c 20 78 5b 31 5d 2c 20 70 50 6f 6c 79 2d  0], x[1], pPoly-
6400: 3e 61 5b 30 5d 2c 20 70 50 6f 6c 79 2d 3e 61 5b  >a[0], pPoly->a[
6410: 31 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a 7d 0a  1], side, i);.}.
6420: 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
6430: 20 6c 69 73 74 73 20 6f 66 20 73 6f 72 74 65 64   lists of sorted
6440: 20 65 76 65 6e 74 73 20 62 79 20 58 20 63 6f 6f   events by X coo
6450: 72 64 69 6e 61 74 65 0a 2a 2f 0a 73 74 61 74 69  rdinate.*/.stati
6460: 63 20 47 65 6f 45 76 65 6e 74 20 2a 67 65 6f 70  c GeoEvent *geop
6470: 6f 6c 79 45 76 65 6e 74 4d 65 72 67 65 28 47 65  olyEventMerge(Ge
6480: 6f 45 76 65 6e 74 20 2a 70 4c 65 66 74 2c 20 47  oEvent *pLeft, G
6490: 65 6f 45 76 65 6e 74 20 2a 70 52 69 67 68 74 29  eoEvent *pRight)
64a0: 7b 0a 20 20 47 65 6f 45 76 65 6e 74 20 68 65 61  {.  GeoEvent hea
64b0: 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20 68 65 61  d, *pLast;.  hea
64c0: 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  d.pNext = 0;.  p
64d0: 4c 61 73 74 20 3d 20 26 68 65 61 64 3b 0a 20 20  Last = &head;.  
64e0: 77 68 69 6c 65 28 20 70 52 69 67 68 74 20 26 26  while( pRight &&
64f0: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
6500: 28 20 70 52 69 67 68 74 2d 3e 78 20 3c 3d 20 70  ( pRight->x <= p
6510: 4c 65 66 74 2d 3e 78 20 29 7b 0a 20 20 20 20 20  Left->x ){.     
6520: 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pLast->pNext = 
6530: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4c  pRight;.      pL
6540: 61 73 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ast = pRight;.  
6550: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 52 69      pRight = pRi
6560: 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ght->pNext;.    
6570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 61  }else{.      pLa
6580: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 65 66  st->pNext = pLef
6590: 74 3b 0a 20 20 20 20 20 20 70 4c 61 73 74 20 3d  t;.      pLast =
65a0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c   pLeft;.      pL
65b0: 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4e 65  eft = pLeft->pNe
65c0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  xt;.    }.  }.  
65d0: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pLast->pNext = p
65e0: 52 69 67 68 74 20 3f 20 70 52 69 67 68 74 20 3a  Right ? pRight :
65f0: 20 70 4c 65 66 74 3b 0a 20 20 72 65 74 75 72 6e   pLeft;.  return
6600: 20 68 65 61 64 2e 70 4e 65 78 74 3b 20 20 0a 7d   head.pNext;  .}
6610: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 6e 20  ../*.** Sort an 
6620: 61 72 72 61 79 20 6f 66 20 6e 45 76 65 6e 74 20  array of nEvent 
6630: 65 76 65 6e 74 20 6f 62 6a 65 63 74 73 20 69 6e  event objects in
6640: 74 6f 20 61 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  to a list..*/.st
6650: 61 74 69 63 20 47 65 6f 45 76 65 6e 74 20 2a 67  atic GeoEvent *g
6660: 65 6f 70 6f 6c 79 53 6f 72 74 45 76 65 6e 74 73  eopolySortEvents
6670: 42 79 58 28 47 65 6f 45 76 65 6e 74 20 2a 61 45  ByX(GeoEvent *aE
6680: 76 65 6e 74 2c 20 69 6e 74 20 6e 45 76 65 6e 74  vent, int nEvent
6690: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 30 3b  ){.  int mx = 0;
66a0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 47  .  int i, j;.  G
66b0: 65 6f 45 76 65 6e 74 20 2a 70 3b 0a 20 20 47 65  eoEvent *p;.  Ge
66c0: 6f 45 76 65 6e 74 20 2a 61 5b 35 30 5d 3b 0a 20  oEvent *a[50];. 
66d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 76 65   for(i=0; i<nEve
66e0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
66f0: 3d 20 26 61 45 76 65 6e 74 5b 69 5d 3b 0a 20 20  = &aEvent[i];.  
6700: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
6710: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6d      for(j=0; j<m
6720: 78 20 26 26 20 61 5b 6a 5d 3b 20 6a 2b 2b 29 7b  x && a[j]; j++){
6730: 0a 20 20 20 20 20 20 70 20 3d 20 67 65 6f 70 6f  .      p = geopo
6740: 6c 79 45 76 65 6e 74 4d 65 72 67 65 28 61 5b 6a  lyEventMerge(a[j
6750: 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 61 5b 6a  ], p);.      a[j
6760: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
6770: 20 61 5b 6a 5d 20 3d 20 70 3b 0a 20 20 20 20 69   a[j] = p;.    i
6780: 66 28 20 6a 3e 3d 6d 78 20 29 20 6d 78 20 3d 20  f( j>=mx ) mx = 
6790: 6a 2b 31 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30  j+1;.  }.  p = 0
67a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
67b0: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  x; i++){.    p =
67c0: 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65 72   geopolyEventMer
67d0: 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 7d  ge(a[i], p);.  }
67e0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
67f0: 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
6800: 6c 69 73 74 73 20 6f 66 20 73 6f 72 74 65 64 20  lists of sorted 
6810: 73 65 67 6d 65 6e 74 73 20 62 79 20 59 2c 20 61  segments by Y, a
6820: 6e 64 20 74 68 65 6e 20 62 79 20 43 2e 0a 2a 2f  nd then by C..*/
6830: 0a 73 74 61 74 69 63 20 47 65 6f 53 65 67 6d 65  .static GeoSegme
6840: 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 65 67 6d 65  nt *geopolySegme
6850: 6e 74 4d 65 72 67 65 28 47 65 6f 53 65 67 6d 65  ntMerge(GeoSegme
6860: 6e 74 20 2a 70 4c 65 66 74 2c 20 47 65 6f 53 65  nt *pLeft, GeoSe
6870: 67 6d 65 6e 74 20 2a 70 52 69 67 68 74 29 7b 0a  gment *pRight){.
6880: 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 68 65 61    GeoSegment hea
6890: 64 2c 20 2a 70 4c 61 73 74 3b 0a 20 20 68 65 61  d, *pLast;.  hea
68a0: 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  d.pNext = 0;.  p
68b0: 4c 61 73 74 20 3d 20 26 68 65 61 64 3b 0a 20 20  Last = &head;.  
68c0: 77 68 69 6c 65 28 20 70 52 69 67 68 74 20 26 26  while( pRight &&
68d0: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 64 6f   pLeft ){.    do
68e0: 75 62 6c 65 20 72 20 3d 20 70 52 69 67 68 74 2d  uble r = pRight-
68f0: 3e 79 20 2d 20 70 4c 65 66 74 2d 3e 79 3b 0a 20  >y - pLeft->y;. 
6900: 20 20 20 69 66 28 20 72 3d 3d 30 2e 30 20 29 20     if( r==0.0 ) 
6910: 72 20 3d 20 70 52 69 67 68 74 2d 3e 43 20 2d 20  r = pRight->C - 
6920: 70 4c 65 66 74 2d 3e 43 3b 0a 20 20 20 20 69 66  pLeft->C;.    if
6930: 28 20 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 20  ( r<0.0 ){.     
6940: 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pLast->pNext = 
6950: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4c  pRight;.      pL
6960: 61 73 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ast = pRight;.  
6970: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 52 69      pRight = pRi
6980: 67 68 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ght->pNext;.    
6990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 61  }else{.      pLa
69a0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 65 66  st->pNext = pLef
69b0: 74 3b 0a 20 20 20 20 20 20 70 4c 61 73 74 20 3d  t;.      pLast =
69c0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4c   pLeft;.      pL
69d0: 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4e 65  eft = pLeft->pNe
69e0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  xt;.    }.  }.  
69f0: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pLast->pNext = p
6a00: 52 69 67 68 74 20 3f 20 70 52 69 67 68 74 20 3a  Right ? pRight :
6a10: 20 70 4c 65 66 74 3b 0a 20 20 72 65 74 75 72 6e   pLeft;.  return
6a20: 20 68 65 61 64 2e 70 4e 65 78 74 3b 20 20 0a 7d   head.pNext;  .}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c  ../*.** Sort a l
6a40: 69 73 74 20 6f 66 20 47 65 6f 53 65 67 6d 65 6e  ist of GeoSegmen
6a50: 74 73 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 69  ts in order of i
6a60: 6e 63 72 65 61 73 69 6e 67 20 59 20 61 6e 64 20  ncreasing Y and 
6a70: 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 0a  in the event of.
6a80: 2a 2a 20 61 20 74 69 65 2c 20 69 6e 63 72 65 61  ** a tie, increa
6a90: 73 69 6e 67 20 43 20 28 73 6c 6f 70 65 29 2e 0a  sing C (slope)..
6aa0: 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 53 65 67  */.static GeoSeg
6ab0: 6d 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 6f 72  ment *geopolySor
6ac0: 74 53 65 67 6d 65 6e 74 73 42 79 59 41 6e 64 43  tSegmentsByYAndC
6ad0: 28 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 4c 69  (GeoSegment *pLi
6ae0: 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  st){.  int mx = 
6af0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 47 65  0;.  int i;.  Ge
6b00: 6f 53 65 67 6d 65 6e 74 20 2a 70 3b 0a 20 20 47  oSegment *p;.  G
6b10: 65 6f 53 65 67 6d 65 6e 74 20 2a 61 5b 35 30 5d  eoSegment *a[50]
6b20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
6b30: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 4c 69 73   ){.    p = pLis
6b40: 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  t;.    pList = p
6b50: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
6b60: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
6b70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78     for(i=0; i<mx
6b80: 20 26 26 20 61 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && a[i]; i++){.
6b90: 20 20 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c        p = geopol
6ba0: 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 61 5b  ySegmentMerge(a[
6bb0: 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 61 5b  i], p);.      a[
6bc0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
6bd0: 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
6be0: 69 66 28 20 69 3e 3d 6d 78 20 29 20 6d 78 20 3d  if( i>=mx ) mx =
6bf0: 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 70 20 3d 20   i+1;.  }.  p = 
6c00: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
6c10: 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  mx; i++){.    p 
6c20: 3d 20 67 65 6f 70 6f 6c 79 53 65 67 6d 65 6e 74  = geopolySegment
6c30: 4d 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a  Merge(a[i], p);.
6c40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
6c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
6c60: 6e 65 20 74 68 65 20 6f 76 65 72 6c 61 70 20 62  ne the overlap b
6c70: 65 74 77 65 65 6e 20 74 77 6f 20 70 6f 6c 79 67  etween two polyg
6c80: 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ons.*/.static in
6c90: 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70  t geopolyOverlap
6ca0: 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c 20 47 65  (GeoPoly *p1, Ge
6cb0: 6f 50 6f 6c 79 20 2a 70 32 29 7b 0a 20 20 69 6e  oPoly *p2){.  in
6cc0: 74 20 6e 56 65 72 74 65 78 20 3d 20 70 31 2d 3e  t nVertex = p1->
6cd0: 6e 56 65 72 74 65 78 20 2b 20 70 32 2d 3e 6e 56  nVertex + p2->nV
6ce0: 65 72 74 65 78 20 2b 20 32 3b 0a 20 20 47 65 6f  ertex + 2;.  Geo
6cf0: 4f 76 65 72 6c 61 70 20 2a 70 3b 0a 20 20 69 6e  Overlap *p;.  in
6d00: 74 20 6e 42 79 74 65 3b 0a 20 20 47 65 6f 45 76  t nByte;.  GeoEv
6d10: 65 6e 74 20 2a 70 54 68 69 73 45 76 65 6e 74 3b  ent *pThisEvent;
6d20: 0a 20 20 64 6f 75 62 6c 65 20 72 58 3b 0a 20 20  .  double rX;.  
6d30: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e  int rc = 0;.  in
6d40: 74 20 6e 65 65 64 53 6f 72 74 20 3d 20 30 3b 0a  t needSort = 0;.
6d50: 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 41    GeoSegment *pA
6d60: 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 47 65 6f  ctive = 0;.  Geo
6d70: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 0a 20  Segment *pSeg;. 
6d80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6d90: 4f 76 65 72 6c 61 70 5b 34 5d 3b 0a 0a 20 20 6e  Overlap[4];..  n
6da0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 47 65  Byte = sizeof(Ge
6db0: 6f 45 76 65 6e 74 29 2a 6e 56 65 72 74 65 78 2a  oEvent)*nVertex*
6dc0: 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20  2 .           + 
6dd0: 73 69 7a 65 6f 66 28 47 65 6f 53 65 67 6d 65 6e  sizeof(GeoSegmen
6de0: 74 29 2a 6e 56 65 72 74 65 78 20 0a 20 20 20 20  t)*nVertex .    
6df0: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
6e00: 47 65 6f 4f 76 65 72 6c 61 70 29 3b 0a 20 20 70  GeoOverlap);.  p
6e10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6e20: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
6e30: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
6e40: 2d 31 3b 0a 20 20 70 2d 3e 61 45 76 65 6e 74 20  -1;.  p->aEvent 
6e50: 3d 20 28 47 65 6f 45 76 65 6e 74 2a 29 26 70 5b  = (GeoEvent*)&p[
6e60: 31 5d 3b 0a 20 20 70 2d 3e 61 53 65 67 6d 65 6e  1];.  p->aSegmen
6e70: 74 20 3d 20 28 47 65 6f 53 65 67 6d 65 6e 74 2a  t = (GeoSegment*
6e80: 29 26 70 2d 3e 61 45 76 65 6e 74 5b 6e 56 65 72  )&p->aEvent[nVer
6e90: 74 65 78 2a 32 5d 3b 0a 20 20 70 2d 3e 6e 45 76  tex*2];.  p->nEv
6ea0: 65 6e 74 20 3d 20 70 2d 3e 6e 53 65 67 6d 65 6e  ent = p->nSegmen
6eb0: 74 20 3d 20 30 3b 0a 20 20 67 65 6f 70 6f 6c 79  t = 0;.  geopoly
6ec0: 41 64 64 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  AddSegments(p, p
6ed0: 31 2c 20 31 29 3b 0a 20 20 67 65 6f 70 6f 6c 79  1, 1);.  geopoly
6ee0: 41 64 64 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  AddSegments(p, p
6ef0: 32 2c 20 32 29 3b 0a 20 20 70 54 68 69 73 45 76  2, 2);.  pThisEv
6f00: 65 6e 74 20 3d 20 67 65 6f 70 6f 6c 79 53 6f 72  ent = geopolySor
6f10: 74 45 76 65 6e 74 73 42 79 58 28 70 2d 3e 61 45  tEventsByX(p->aE
6f20: 76 65 6e 74 2c 20 70 2d 3e 6e 45 76 65 6e 74 29  vent, p->nEvent)
6f30: 3b 0a 20 20 72 58 20 3d 20 70 54 68 69 73 45 76  ;.  rX = pThisEv
6f40: 65 6e 74 2d 3e 78 3d 3d 30 2e 30 20 3f 20 2d 31  ent->x==0.0 ? -1
6f50: 2e 30 20 3a 20 30 2e 30 3b 0a 20 20 6d 65 6d 73  .0 : 0.0;.  mems
6f60: 65 74 28 61 4f 76 65 72 6c 61 70 2c 20 30 2c 20  et(aOverlap, 0, 
6f70: 73 69 7a 65 6f 66 28 61 4f 76 65 72 6c 61 70 29  sizeof(aOverlap)
6f80: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 68 69  );.  while( pThi
6f90: 73 45 76 65 6e 74 20 29 7b 0a 20 20 20 20 69 66  sEvent ){.    if
6fa0: 28 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 21  ( pThisEvent->x!
6fb0: 3d 72 58 20 29 7b 0a 20 20 20 20 20 20 47 65 6f  =rX ){.      Geo
6fc0: 53 65 67 6d 65 6e 74 20 2a 70 50 72 65 76 20 3d  Segment *pPrev =
6fd0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   0;.      int iM
6fe0: 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 47  ask = 0;.      G
6ff0: 45 4f 44 45 42 55 47 28 28 22 44 69 73 74 69 6e  EODEBUG(("Distin
7000: 63 74 20 58 3a 20 25 67 5c 6e 22 2c 20 70 54 68  ct X: %g\n", pTh
7010: 69 73 45 76 65 6e 74 2d 3e 78 29 29 3b 0a 20 20  isEvent->x));.  
7020: 20 20 20 20 72 58 20 3d 20 70 54 68 69 73 45 76      rX = pThisEv
7030: 65 6e 74 2d 3e 78 3b 0a 20 20 20 20 20 20 69 66  ent->x;.      if
7040: 28 20 6e 65 65 64 53 6f 72 74 20 29 7b 0a 20 20  ( needSort ){.  
7050: 20 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28        GEODEBUG((
7060: 22 53 4f 52 54 5c 6e 22 29 29 3b 0a 20 20 20 20  "SORT\n"));.    
7070: 20 20 20 20 70 41 63 74 69 76 65 20 3d 20 67 65      pActive = ge
7080: 6f 70 6f 6c 79 53 6f 72 74 53 65 67 6d 65 6e 74  opolySortSegment
7090: 73 42 79 59 41 6e 64 43 28 70 41 63 74 69 76 65  sByYAndC(pActive
70a0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 53  );.        needS
70b0: 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
70c0: 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d  .      for(pSeg=
70d0: 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70  pActive; pSeg; p
70e0: 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29  Seg=pSeg->pNext)
70f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
7100: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
7110: 20 69 66 28 20 70 50 72 65 76 2d 3e 79 21 3d 70   if( pPrev->y!=p
7120: 53 65 67 2d 3e 79 20 29 7b 0a 20 20 20 20 20 20  Seg->y ){.      
7130: 20 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28        GEODEBUG((
7140: 22 4d 41 53 4b 3a 20 25 64 5c 6e 22 2c 20 69 4d  "MASK: %d\n", iM
7150: 61 73 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ask));.         
7160: 20 20 20 61 4f 76 65 72 6c 61 70 5b 69 4d 61 73     aOverlap[iMas
7170: 6b 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  k] = 1;.        
7180: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7190: 20 20 20 20 20 20 69 4d 61 73 6b 20 5e 3d 20 70        iMask ^= p
71a0: 53 65 67 2d 3e 73 69 64 65 3b 0a 20 20 20 20 20  Seg->side;.     
71b0: 20 20 20 70 50 72 65 76 20 3d 20 70 53 65 67 3b     pPrev = pSeg;
71c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
71d0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
71e0: 66 6f 72 28 70 53 65 67 3d 70 41 63 74 69 76 65  for(pSeg=pActive
71f0: 3b 20 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65  ; pSeg; pSeg=pSe
7200: 67 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  g->pNext){.     
7210: 20 20 20 64 6f 75 62 6c 65 20 79 20 3d 20 70 53     double y = pS
7220: 65 67 2d 3e 43 2a 72 58 20 2b 20 70 53 65 67 2d  eg->C*rX + pSeg-
7230: 3e 42 3b 0a 20 20 20 20 20 20 20 20 47 45 4f 44  >B;.        GEOD
7240: 45 42 55 47 28 28 22 53 65 67 6d 65 6e 74 20 25  EBUG(("Segment %
7250: 64 2e 25 64 20 25 67 2d 3e 25 67 5c 6e 22 2c 20  d.%d %g->%g\n", 
7260: 70 53 65 67 2d 3e 73 69 64 65 2c 20 70 53 65 67  pSeg->side, pSeg
7270: 2d 3e 69 64 78 2c 20 70 53 65 67 2d 3e 79 2c 20  ->idx, pSeg->y, 
7280: 79 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  y));.        pSe
7290: 67 2d 3e 79 20 3d 20 79 3b 0a 20 20 20 20 20 20  g->y = y;.      
72a0: 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20    if( pPrev ){. 
72b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
72c0: 65 76 2d 3e 79 3e 70 53 65 67 2d 3e 79 20 26 26  ev->y>pSeg->y &&
72d0: 20 70 50 72 65 76 2d 3e 73 69 64 65 21 3d 70 53   pPrev->side!=pS
72e0: 65 67 2d 3e 73 69 64 65 20 29 7b 0a 20 20 20 20  eg->side ){.    
72f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
7300: 20 20 20 20 20 20 20 20 20 20 20 20 47 45 4f 44              GEOD
7310: 45 42 55 47 28 28 22 43 72 6f 73 73 69 6e 67 3a  EBUG(("Crossing:
7320: 20 25 64 2e 25 64 20 61 6e 64 20 25 64 2e 25 64   %d.%d and %d.%d
7330: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
7340: 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
7350: 73 69 64 65 2c 20 70 50 72 65 76 2d 3e 69 64 78  side, pPrev->idx
7360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7370: 20 20 20 20 20 20 70 53 65 67 2d 3e 73 69 64 65        pSeg->side
7380: 2c 20 70 53 65 67 2d 3e 69 64 78 29 29 3b 0a 20  , pSeg->idx));. 
7390: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
73a0: 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 44 6f  geopolyOverlapDo
73b0: 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ne;.          }e
73c0: 6c 73 65 20 69 66 28 20 70 50 72 65 76 2d 3e 79  lse if( pPrev->y
73d0: 21 3d 70 53 65 67 2d 3e 79 20 29 7b 0a 20 20 20  !=pSeg->y ){.   
73e0: 20 20 20 20 20 20 20 20 20 47 45 4f 44 45 42 55           GEODEBU
73f0: 47 28 28 22 4d 41 53 4b 3a 20 25 64 5c 6e 22 2c  G(("MASK: %d\n",
7400: 20 69 4d 61 73 6b 29 29 3b 0a 20 20 20 20 20 20   iMask));.      
7410: 20 20 20 20 20 20 61 4f 76 65 72 6c 61 70 5b 69        aOverlap[i
7420: 4d 61 73 6b 5d 20 3d 20 31 3b 0a 20 20 20 20 20  Mask] = 1;.     
7430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7440: 0a 20 20 20 20 20 20 20 20 69 4d 61 73 6b 20 5e  .        iMask ^
7450: 3d 20 70 53 65 67 2d 3e 73 69 64 65 3b 0a 20 20  = pSeg->side;.  
7460: 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 53        pPrev = pS
7470: 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
7480: 7d 0a 20 20 20 20 47 45 4f 44 45 42 55 47 28 28  }.    GEODEBUG((
7490: 22 25 73 20 25 64 2e 25 64 20 43 3d 25 67 20 42  "%s %d.%d C=%g B
74a0: 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 70 54  =%g\n",.      pT
74b0: 68 69 73 45 76 65 6e 74 2d 3e 65 54 79 70 65 20  hisEvent->eType 
74c0: 3f 20 22 52 4d 20 22 20 3a 20 22 41 44 44 22 2c  ? "RM " : "ADD",
74d0: 0a 20 20 20 20 20 20 70 54 68 69 73 45 76 65 6e  .      pThisEven
74e0: 74 2d 3e 70 53 65 67 2d 3e 73 69 64 65 2c 20 70  t->pSeg->side, p
74f0: 54 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d  ThisEvent->pSeg-
7500: 3e 69 64 78 2c 0a 20 20 20 20 20 20 70 54 68 69  >idx,.      pThi
7510: 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e 43 2c  sEvent->pSeg->C,
7520: 0a 20 20 20 20 20 20 70 54 68 69 73 45 76 65 6e  .      pThisEven
7530: 74 2d 3e 70 53 65 67 2d 3e 42 29 29 3b 0a 20 20  t->pSeg->B));.  
7540: 20 20 69 66 28 20 70 54 68 69 73 45 76 65 6e 74    if( pThisEvent
7550: 2d 3e 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ->eType==0 ){.  
7560: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67      /* Add a seg
7570: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 53  ment */.      pS
7580: 65 67 20 3d 20 70 54 68 69 73 45 76 65 6e 74 2d  eg = pThisEvent-
7590: 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 70 53 65  >pSeg;.      pSe
75a0: 67 2d 3e 79 20 3d 20 70 53 65 67 2d 3e 79 30 3b  g->y = pSeg->y0;
75b0: 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65  .      pSeg->pNe
75c0: 78 74 20 3d 20 70 41 63 74 69 76 65 3b 0a 20 20  xt = pActive;.  
75d0: 20 20 20 20 70 41 63 74 69 76 65 20 3d 20 70 53      pActive = pS
75e0: 65 67 3b 0a 20 20 20 20 20 20 6e 65 65 64 53 6f  eg;.      needSo
75f0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rt = 1;.    }els
7600: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  e{.      /* Remo
7610: 76 65 20 61 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  ve a segment */.
7620: 20 20 20 20 20 20 69 66 28 20 70 41 63 74 69 76        if( pActiv
7630: 65 3d 3d 70 54 68 69 73 45 76 65 6e 74 2d 3e 70  e==pThisEvent->p
7640: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Seg ){.        p
7650: 41 63 74 69 76 65 20 3d 20 70 41 63 74 69 76 65  Active = pActive
7660: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
7680: 72 28 70 53 65 67 3d 70 41 63 74 69 76 65 3b 20  r(pSeg=pActive; 
7690: 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65 67 2d  pSeg; pSeg=pSeg-
76a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
76b0: 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4e 65     if( pSeg->pNe
76c0: 78 74 3d 3d 70 54 68 69 73 45 76 65 6e 74 2d 3e  xt==pThisEvent->
76d0: 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pSeg ){.        
76e0: 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 20      pSeg->pNext 
76f0: 3d 20 70 53 65 67 2d 3e 70 4e 65 78 74 2d 3e 70  = pSeg->pNext->p
7700: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
7710: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7740: 20 70 54 68 69 73 45 76 65 6e 74 20 3d 20 70 54   pThisEvent = pT
7750: 68 69 73 45 76 65 6e 74 2d 3e 70 4e 65 78 74 3b  hisEvent->pNext;
7760: 0a 20 20 7d 0a 20 20 69 66 28 20 61 4f 76 65 72  .  }.  if( aOver
7770: 6c 61 70 5b 33 5d 3d 3d 30 20 29 7b 0a 20 20 20  lap[3]==0 ){.   
7780: 20 72 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   rc = 0;.  }else
7790: 20 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d   if( aOverlap[1]
77a0: 21 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70 5b  !=0 && aOverlap[
77b0: 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  2]==0 ){.    rc 
77c0: 3d 20 33 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 3;.  }else if(
77d0: 20 61 4f 76 65 72 6c 61 70 5b 31 5d 3d 3d 30 20   aOverlap[1]==0 
77e0: 26 26 20 61 4f 76 65 72 6c 61 70 5b 32 5d 21 3d  && aOverlap[2]!=
77f0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b  0 ){.    rc = 2;
7800: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4f 76  .  }else if( aOv
7810: 65 72 6c 61 70 5b 31 5d 3d 3d 30 20 26 26 20 61  erlap[1]==0 && a
7820: 4f 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20 29 7b  Overlap[2]==0 ){
7830: 0a 20 20 20 20 72 63 20 3d 20 34 3b 0a 20 20 7d  .    rc = 4;.  }
7840: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
7850: 3b 0a 20 20 7d 0a 0a 67 65 6f 70 6f 6c 79 4f 76  ;.  }..geopolyOv
7860: 65 72 6c 61 70 44 6f 6e 65 3a 0a 20 20 73 71 6c  erlapDone:.  sql
7870: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
7880: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7890: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
78a0: 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 6f 76 65  :    geopoly_ove
78b0: 72 6c 61 70 28 50 31 2c 50 32 29 0a 2a 2a 0a 2a  rlap(P1,P2).**.*
78c0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
78d0: 68 65 72 20 6f 72 20 6e 6f 74 20 50 31 20 61 6e  her or not P1 an
78e0: 64 20 50 32 20 6f 76 65 72 6c 61 70 2e 20 52 65  d P2 overlap. Re
78f0: 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a  turn value:.**.*
7900: 2a 20 20 20 30 20 20 20 20 20 54 68 65 20 74 77  *   0     The tw
7910: 6f 20 70 6f 6c 79 67 6f 6e 73 20 61 72 65 20 64  o polygons are d
7920: 69 73 6a 6f 69 6e 74 0a 2a 2a 20 20 20 31 20 20  isjoint.**   1  
7930: 20 20 20 54 68 65 79 20 6f 76 65 72 6c 61 70 0a     They overlap.
7940: 2a 2a 20 20 20 32 20 20 20 20 20 50 31 20 69 73  **   2     P1 is
7950: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 74   completely cont
7960: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 50 32 0a  ained within P2.
7970: 2a 2a 20 20 20 33 20 20 20 20 20 50 32 20 69 73  **   3     P2 is
7980: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 74   completely cont
7990: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 50 31 0a  ained within P1.
79a0: 2a 2a 20 20 20 34 20 20 20 20 20 50 31 20 61 6e  **   4     P1 an
79b0: 64 20 50 32 20 61 72 65 20 74 68 65 20 73 61 6d  d P2 are the sam
79c0: 65 20 70 6f 6c 79 67 6f 6e 0a 2a 2a 20 20 20 4e  e polygon.**   N
79d0: 55 4c 4c 20 20 45 69 74 68 65 72 20 50 31 20 6f  ULL  Either P1 o
79e0: 72 20 50 32 20 6f 72 20 62 6f 74 68 20 61 72 65  r P2 or both are
79f0: 20 6e 6f 74 20 76 61 6c 69 64 20 70 6f 6c 79 67   not valid polyg
7a00: 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons.*/.static vo
7a10: 69 64 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61  id geopolyOverla
7a20: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
7a30: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7a40: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7a50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7a60: 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65 6f 50 6f  *argv.){.  GeoPo
7a70: 6c 79 20 2a 70 31 20 3d 20 67 65 6f 70 6f 6c 79  ly *p1 = geopoly
7a80: 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78  FuncParam(contex
7a90: 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  t, argv[0], 0);.
7aa0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 32 20 3d 20    GeoPoly *p2 = 
7ab0: 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d  geopolyFuncParam
7ac0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 31  (context, argv[1
7ad0: 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 31 20  ], 0);.  if( p1 
7ae0: 26 26 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74  && p2 ){.    int
7af0: 20 78 20 3d 20 67 65 6f 70 6f 6c 79 4f 76 65 72   x = geopolyOver
7b00: 6c 61 70 28 70 31 2c 20 70 32 29 3b 0a 20 20 20  lap(p1, p2);.   
7b10: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
7b20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7b30: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
7b40: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
7b50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7b60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7b70: 78 74 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20  xt, x);.    }.  
7b80: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
7b90: 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (p1);.  sqlite3_
7ba0: 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a  free(p2);.}../*.
7bb0: 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
7bc0: 61 62 6c 65 20 64 65 62 75 67 67 69 6e 67 20 6f  able debugging o
7bd0: 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  utput.*/.static 
7be0: 76 6f 69 64 20 67 65 6f 70 6f 6c 79 44 65 62 75  void geopolyDebu
7bf0: 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  gFunc(.  sqlite3
7c00: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7c10: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7c30: 2a 61 72 67 76 0a 29 7b 0a 23 69 66 64 65 66 20  *argv.){.#ifdef 
7c40: 47 45 4f 50 4f 4c 59 5f 45 4e 41 42 4c 45 5f 44  GEOPOLY_ENABLE_D
7c50: 45 42 55 47 0a 20 20 67 65 6f 5f 64 65 62 75 67  EBUG.  geo_debug
7c60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7c70: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  _int(argv[0]);.#
7c80: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
7c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7ca0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
7cb0: 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20  ion of both the 
7cc0: 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72  xConnect and xCr
7cd0: 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  eate.** methods 
7ce0: 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79 20 76  of the geopoly v
7cf0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
7d00: 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20  .**   argv[0]   
7d10: 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 0a 2a  -> module name.*
7d20: 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e  *   argv[1]   ->
7d30: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
7d40: 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e  *   argv[2]   ->
7d50: 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20   table name.**  
7d60: 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 63 6f   argv[...] -> co
7d70: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a 2a 2f  lumn names....*/
7d80: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70  .static int geop
7d90: 6f 6c 79 49 6e 69 74 28 0a 20 20 73 71 6c 69 74  olyInit(.  sqlit
7da0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7dc0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
7dd0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
7de0: 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20 20  *pAux,          
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e00: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 52 54 52  * One of the RTR
7e10: 45 45 5f 43 4f 4f 52 44 5f 2a 20 63 6f 6e 73 74  EE_COORD_* const
7e20: 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72  ants */.  int ar
7e30: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
7e40: 63 6f 6e 73 74 2a 61 72 67 76 2c 20 20 20 2f 2a  const*argv,   /*
7e50: 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 43   Parameters to C
7e60: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7e70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ement */.  sqlit
7e80: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
7e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7ea0: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 69 72 74 75  * OUT: New virtu
7eb0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  al table */.  ch
7ec0: 61 72 20 2a 2a 70 7a 45 72 72 2c 20 20 20 20 20  ar **pzErr,     
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
7ef0: 6d 65 73 73 61 67 65 2c 20 69 66 20 61 6e 79 20  message, if any 
7f00: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  */.  int isCreat
7f10: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
7f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7f30: 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66 61   for xCreate, fa
7f40: 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63 74  lse for xConnect
7f50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
7f60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
7f70: 74 72 65 65 20 2a 70 52 74 72 65 65 3b 0a 20 20  tree *pRtree;.  
7f80: 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
7f90: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
7fa0: 6f 66 20 73 74 72 69 6e 67 20 61 72 67 76 5b 31  of string argv[1
7fb0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ] */.  int nName
7fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7fd0: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
7fe0: 20 61 72 67 76 5b 32 5d 20 2a 2f 0a 20 20 73 71   argv[2] */.  sq
7ff0: 6c 69 74 65 33 5f 73 74 72 20 2a 70 53 71 6c 3b  lite3_str *pSql;
8000: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
8010: 20 69 6e 74 20 69 69 3b 0a 0a 20 20 73 71 6c 69   int ii;..  sqli
8020: 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67 28  te3_vtab_config(
8030: 64 62 2c 20 53 51 4c 49 54 45 5f 56 54 41 42 5f  db, SQLITE_VTAB_
8040: 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f  CONSTRAINT_SUPPO
8050: 52 54 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 41 6c  RT, 1);..  /* Al
8060: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
8070: 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
8080: 65 20 2a 2f 0a 20 20 6e 44 62 20 3d 20 28 69 6e  e */.  nDb = (in
8090: 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  t)strlen(argv[1]
80a0: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e  );.  nName = (in
80b0: 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d  t)strlen(argv[2]
80c0: 29 3b 0a 20 20 70 52 74 72 65 65 20 3d 20 28 52  );.  pRtree = (R
80d0: 74 72 65 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  tree *)sqlite3_m
80e0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 74 72  alloc(sizeof(Rtr
80f0: 65 65 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29  ee)+nDb+nName+2)
8100: 3b 0a 20 20 69 66 28 20 21 70 52 74 72 65 65 20  ;.  if( !pRtree 
8110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8120: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8130: 20 20 6d 65 6d 73 65 74 28 70 52 74 72 65 65 2c    memset(pRtree,
8140: 20 30 2c 20 73 69 7a 65 6f 66 28 52 74 72 65 65   0, sizeof(Rtree
8150: 29 2b 6e 44 62 2b 6e 4e 61 6d 65 2b 32 29 3b 0a  )+nDb+nName+2);.
8160: 20 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79 20    pRtree->nBusy 
8170: 3d 20 31 3b 0a 20 20 70 52 74 72 65 65 2d 3e 62  = 1;.  pRtree->b
8180: 61 73 65 2e 70 4d 6f 64 75 6c 65 20 3d 20 26 72  ase.pModule = &r
8190: 74 72 65 65 4d 6f 64 75 6c 65 3b 0a 20 20 70 52  treeModule;.  pR
81a0: 74 72 65 65 2d 3e 7a 44 62 20 3d 20 28 63 68 61  tree->zDb = (cha
81b0: 72 20 2a 29 26 70 52 74 72 65 65 5b 31 5d 3b 0a  r *)&pRtree[1];.
81c0: 20 20 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 20    pRtree->zName 
81d0: 3d 20 26 70 52 74 72 65 65 2d 3e 7a 44 62 5b 6e  = &pRtree->zDb[n
81e0: 44 62 2b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d  Db+1];.  pRtree-
81f0: 3e 65 43 6f 6f 72 64 54 79 70 65 20 3d 20 52 54  >eCoordType = RT
8200: 52 45 45 5f 43 4f 4f 52 44 5f 52 45 41 4c 33 32  REE_COORD_REAL32
8210: 3b 0a 20 20 70 52 74 72 65 65 2d 3e 6e 44 69 6d  ;.  pRtree->nDim
8220: 20 3d 20 32 3b 0a 20 20 70 52 74 72 65 65 2d 3e   = 2;.  pRtree->
8230: 6e 44 69 6d 32 20 3d 20 34 3b 0a 20 20 6d 65 6d  nDim2 = 4;.  mem
8240: 63 70 79 28 70 52 74 72 65 65 2d 3e 7a 44 62 2c  cpy(pRtree->zDb,
8250: 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29 3b 0a   argv[1], nDb);.
8260: 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65 65 2d    memcpy(pRtree-
8270: 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 32 5d 2c  >zName, argv[2],
8280: 20 6e 4e 61 6d 65 29 3b 0a 0a 0a 20 20 2f 2a 20   nName);...  /* 
8290: 43 72 65 61 74 65 2f 43 6f 6e 6e 65 63 74 20 74  Create/Connect t
82a0: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
82b0: 20 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61   relational data
82c0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 0a  base schema. If.
82d0: 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 75 63    ** that is suc
82e0: 63 65 73 73 66 75 6c 2c 20 63 61 6c 6c 20 73 71  cessful, call sq
82f0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
8300: 61 62 28 29 20 74 6f 20 63 6f 6e 66 69 67 75 72  ab() to configur
8310: 65 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74 72 65  e.  ** the r-tre
8320: 65 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e 0a  e table schema..
8330: 20 20 2a 2f 0a 20 20 70 53 71 6c 20 3d 20 73 71    */.  pSql = sq
8340: 6c 69 74 65 33 5f 73 74 72 5f 6e 65 77 28 64 62  lite3_str_new(db
8350: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  );.  sqlite3_str
8360: 5f 61 70 70 65 6e 64 66 28 70 53 71 6c 2c 20 22  _appendf(pSql, "
8370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 5f  CREATE TABLE x(_
8380: 73 68 61 70 65 22 29 3b 0a 20 20 70 52 74 72 65  shape");.  pRtre
8390: 65 2d 3e 6e 41 75 78 20 3d 20 31 3b 20 20 20 20  e->nAux = 1;    
83a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 6e 65 20       /* Add one 
83b0: 66 6f 72 20 5f 73 68 61 70 65 20 2a 2f 0a 20 20  for _shape */.  
83c0: 70 52 74 72 65 65 2d 3e 6e 41 75 78 4e 6f 74 4e  pRtree->nAuxNotN
83d0: 75 6c 6c 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ull = 1;  /* The
83e0: 20 5f 73 68 61 70 65 20 63 6f 6c 75 6d 6e 20 69   _shape column i
83f0: 73 20 61 6c 77 61 79 73 20 6e 6f 74 2d 6e 75 6c  s always not-nul
8400: 6c 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 33 3b  l */.  for(ii=3;
8410: 20 69 69 3c 61 72 67 63 3b 20 69 69 2b 2b 29 7b   ii<argc; ii++){
8420: 0a 20 20 20 20 70 52 74 72 65 65 2d 3e 6e 41 75  .    pRtree->nAu
8430: 78 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  x++;.    sqlite3
8440: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 53 71  _str_appendf(pSq
8450: 6c 2c 20 22 2c 25 73 22 2c 20 61 72 67 76 5b 69  l, ",%s", argv[i
8460: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
8470: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
8480: 53 71 6c 2c 20 22 29 3b 22 29 3b 0a 20 20 7a 53  Sql, ");");.  zS
8490: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  ql = sqlite3_str
84a0: 5f 66 69 6e 69 73 68 28 70 53 71 6c 29 3b 0a 20  _finish(pSql);. 
84b0: 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
84c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
84d0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  MEM;.  }else if(
84e0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
84f0: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
8500: 65 5f 76 74 61 62 28 64 62 2c 20 7a 53 71 6c 29  e_vtab(db, zSql)
8510: 29 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20  ) ){.    *pzErr 
8520: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8530: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
8540: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
8550: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8560: 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
8570: 29 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e  ) goto geopolyIn
8580: 69 74 5f 66 61 69 6c 3b 0a 20 20 70 52 74 72 65  it_fail;.  pRtre
8590: 65 2d 3e 6e 42 79 74 65 73 50 65 72 43 65 6c 6c  e->nBytesPerCell
85a0: 20 3d 20 38 20 2b 20 70 52 74 72 65 65 2d 3e 6e   = 8 + pRtree->n
85b0: 44 69 6d 32 2a 34 3b 0a 0a 20 20 2f 2a 20 46 69  Dim2*4;..  /* Fi
85c0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 6f 64  gure out the nod
85d0: 65 20 73 69 7a 65 20 74 6f 20 75 73 65 2e 20 2a  e size to use. *
85e0: 2f 0a 20 20 72 63 20 3d 20 67 65 74 4e 6f 64 65  /.  rc = getNode
85f0: 53 69 7a 65 28 64 62 2c 20 70 52 74 72 65 65 2c  Size(db, pRtree,
8600: 20 69 73 43 72 65 61 74 65 2c 20 70 7a 45 72 72   isCreate, pzErr
8610: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
8620: 74 6f 20 67 65 6f 70 6f 6c 79 49 6e 69 74 5f 66  to geopolyInit_f
8630: 61 69 6c 3b 0a 20 20 72 63 20 3d 20 72 74 72 65  ail;.  rc = rtre
8640: 65 53 71 6c 49 6e 69 74 28 70 52 74 72 65 65 2c  eSqlInit(pRtree,
8650: 20 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72   db, argv[1], ar
8660: 67 76 5b 32 5d 2c 20 69 73 43 72 65 61 74 65 29  gv[2], isCreate)
8670: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8680: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
8690: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
86a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
86b0: 64 62 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  db));.    goto g
86c0: 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3b  eopolyInit_fail;
86d0: 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20  .  }..  *ppVtab 
86e0: 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  = (sqlite3_vtab 
86f0: 2a 29 70 52 74 72 65 65 3b 0a 20 20 72 65 74 75  *)pRtree;.  retu
8700: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
8710: 65 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3a  eopolyInit_fail:
8720: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8730: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
8740: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
8750: 72 74 28 20 2a 70 70 56 74 61 62 3d 3d 30 20 29  rt( *ppVtab==0 )
8760: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 74 72  ;.  assert( pRtr
8770: 65 65 2d 3e 6e 42 75 73 79 3d 3d 31 20 29 3b 0a  ee->nBusy==1 );.
8780: 20 20 72 74 72 65 65 52 65 6c 65 61 73 65 28 70    rtreeRelease(p
8790: 52 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  Rtree);.  return
87a0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20   rc;.}.../* .** 
87b0: 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61 6c 20  GEOPOLY virtual 
87c0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 72  table module xCr
87d0: 65 61 74 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  eate method..*/.
87e0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f  static int geopo
87f0: 6c 79 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69  lyCreate(.  sqli
8800: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
8810: 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
8820: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
8830: 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
8840: 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
8850: 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
8860: 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  rr.){.  return g
8870: 65 6f 70 6f 6c 79 49 6e 69 74 28 64 62 2c 20 70  eopolyInit(db, p
8880: 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Aux, argc, argv,
8890: 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20   ppVtab, pzErr, 
88a0: 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 45  1);.}../* .** GE
88b0: 4f 50 4f 4c 59 20 76 69 72 74 75 61 6c 20 74 61  OPOLY virtual ta
88c0: 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
88d0: 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
88e0: 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c  tatic int geopol
88f0: 79 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  yConnect(.  sqli
8900: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
8910: 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
8920: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
8930: 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
8940: 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
8950: 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
8960: 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  rr.){.  return g
8970: 65 6f 70 6f 6c 79 49 6e 69 74 28 64 62 2c 20 70  eopolyInit(db, p
8980: 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Aux, argc, argv,
8990: 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 2c 20   ppVtab, pzErr, 
89a0: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 47  0);.}.../* .** G
89b0: 45 4f 50 4f 4c 59 20 76 69 72 74 75 61 6c 20 74  EOPOLY virtual t
89c0: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69 6c  able module xFil
89d0: 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  ter method..**.*
89e0: 2a 20 51 75 65 72 79 20 70 6c 61 6e 73 3a 0a 2a  * Query plans:.*
89f0: 2a 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  *.**      1     
8a00: 20 20 20 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70      rowid lookup
8a10: 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
8a20: 20 20 20 73 65 61 72 63 68 20 66 6f 72 20 6f 62     search for ob
8a30: 6a 65 63 74 73 20 6f 76 65 72 6c 61 70 70 69 6e  jects overlappin
8a40: 67 20 74 68 65 20 73 61 6d 65 20 62 6f 75 6e 64  g the same bound
8a50: 69 6e 67 20 62 6f 78 0a 2a 2a 20 20 20 20 20 20  ing box.**      
8a60: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63            that c
8a70: 6f 6e 74 61 69 6e 73 20 70 6f 6c 79 67 6f 6e 20  ontains polygon 
8a80: 61 72 67 76 5b 30 5d 0a 2a 2a 20 20 20 20 20 20  argv[0].**      
8a90: 33 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68  3         search
8aa0: 20 66 6f 72 20 6f 62 6a 65 63 74 73 20 6f 76 65   for objects ove
8ab0: 72 6c 61 70 70 69 6e 67 20 74 68 65 20 73 61 6d  rlapping the sam
8ac0: 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 2a  e bounding box.*
8ad0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
8ae0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
8af0: 6f 6c 79 67 6f 6e 20 61 72 67 76 5b 30 5d 0a 2a  olygon argv[0].*
8b00: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
8b10: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
8b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
8b30: 65 6f 70 6f 6c 79 46 69 6c 74 65 72 28 0a 20 20  eopolyFilter(.  
8b40: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
8b50: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
8b60: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ,     /* The cur
8b70: 73 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sor to initializ
8b80: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75  e */.  int idxNu
8b90: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bb0: 51 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  Query plan */.  
8bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
8bd0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
8be0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 55 73 65        /* Not Use
8bf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8c10: 2a 61 72 67 76 20 20 20 20 20 20 20 20 2f 2a 20  *argv        /* 
8c20: 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  Parameters to th
8c30: 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  e query plan */.
8c40: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
8c50: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 70 56  ee = (Rtree *)pV
8c60: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
8c70: 3b 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20  ;.  RtreeCursor 
8c80: 2a 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75  *pCsr = (RtreeCu
8c90: 72 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73  rsor *)pVtabCurs
8ca0: 6f 72 3b 0a 20 20 52 74 72 65 65 4e 6f 64 65 20  or;.  RtreeNode 
8cb0: 2a 70 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 69 6e  *pRoot = 0;.  in
8cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8cd0: 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20  ;.  int iCell = 
8ce0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
8cf0: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 72 74 72  t *pStmt;..  rtr
8d00: 65 65 52 65 66 65 72 65 6e 63 65 28 70 52 74 72  eeReference(pRtr
8d10: 65 65 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 65 74  ee);..  /* Reset
8d20: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
8d30: 68 65 20 73 61 6d 65 20 73 74 61 74 65 20 61 73  he same state as
8d40: 20 72 74 72 65 65 4f 70 65 6e 28 29 20 6c 65 61   rtreeOpen() lea
8d50: 76 65 73 20 69 74 20 69 6e 2e 20 2a 2f 0a 20 20  ves it in. */.  
8d60: 66 72 65 65 43 75 72 73 6f 72 43 6f 6e 73 74 72  freeCursorConstr
8d70: 61 69 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 73  aints(pCsr);.  s
8d80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
8d90: 2d 3e 61 50 6f 69 6e 74 29 3b 0a 20 20 70 53 74  ->aPoint);.  pSt
8da0: 6d 74 20 3d 20 70 43 73 72 2d 3e 70 52 65 61 64  mt = pCsr->pRead
8db0: 41 75 78 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  Aux;.  memset(pC
8dc0: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 74  sr, 0, sizeof(Rt
8dd0: 72 65 65 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  reeCursor));.  p
8de0: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20  Csr->base.pVtab 
8df0: 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a  = (sqlite3_vtab*
8e00: 29 70 52 74 72 65 65 3b 0a 20 20 70 43 73 72 2d  )pRtree;.  pCsr-
8e10: 3e 70 52 65 61 64 41 75 78 20 3d 20 70 53 74 6d  >pReadAux = pStm
8e20: 74 3b 0a 0a 20 20 70 43 73 72 2d 3e 69 53 74 72  t;..  pCsr->iStr
8e30: 61 74 65 67 79 20 3d 20 69 64 78 4e 75 6d 3b 0a  ategy = idxNum;.
8e40: 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 31 20    if( idxNum==1 
8e50: 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61  ){.    /* Specia
8e60: 6c 20 63 61 73 65 20 2d 20 6c 6f 6f 6b 75 70 20  l case - lookup 
8e70: 62 79 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20  by rowid. */.   
8e80: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61   RtreeNode *pLea
8e90: 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61  f;        /* Lea
8ea0: 66 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 72  f on which the r
8eb0: 65 71 75 69 72 65 64 20 63 65 6c 6c 20 72 65 73  equired cell res
8ec0: 69 64 65 73 20 2a 2f 0a 20 20 20 20 52 74 72 65  ides */.    Rtre
8ed0: 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70 3b  eSearchPoint *p;
8ee0: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 70       /* Search p
8ef0: 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 6c 65 61  oint for the lea
8f00: 66 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  f */.    i64 iRo
8f10: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
8f20: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
8f30: 5d 29 3b 0a 20 20 20 20 69 36 34 20 69 4e 6f 64  ]);.    i64 iNod
8f40: 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  e = 0;.    rc = 
8f50: 66 69 6e 64 4c 65 61 66 4e 6f 64 65 28 70 52 74  findLeafNode(pRt
8f60: 72 65 65 2c 20 69 52 6f 77 69 64 2c 20 26 70 4c  ree, iRowid, &pL
8f70: 65 61 66 2c 20 26 69 4e 6f 64 65 29 3b 0a 20 20  eaf, &iNode);.  
8f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8f90: 5f 4f 4b 20 26 26 20 70 4c 65 61 66 21 3d 30 20  _OK && pLeaf!=0 
8fa0: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 72 74 72  ){.      p = rtr
8fb0: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 4e 65 77  eeSearchPointNew
8fc0: 28 70 43 73 72 2c 20 52 54 52 45 45 5f 5a 45 52  (pCsr, RTREE_ZER
8fd0: 4f 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  O, 0);.      ass
8fe0: 65 72 74 28 20 70 21 3d 30 20 29 3b 20 20 2f 2a  ert( p!=0 );  /*
8ff0: 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   Always returns 
9000: 70 43 73 72 2d 3e 73 50 6f 69 6e 74 20 2a 2f 0a  pCsr->sPoint */.
9010: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 4e 6f 64        pCsr->aNod
9020: 65 5b 30 5d 20 3d 20 70 4c 65 61 66 3b 0a 20 20  e[0] = pLeaf;.  
9030: 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 4e 6f 64      p->id = iNod
9040: 65 3b 0a 20 20 20 20 20 20 70 2d 3e 65 57 69 74  e;.      p->eWit
9050: 68 69 6e 20 3d 20 50 41 52 54 4c 59 5f 57 49 54  hin = PARTLY_WIT
9060: 48 49 4e 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  HIN;.      rc = 
9070: 6e 6f 64 65 52 6f 77 69 64 49 6e 64 65 78 28 70  nodeRowidIndex(p
9080: 52 74 72 65 65 2c 20 70 4c 65 61 66 2c 20 69 52  Rtree, pLeaf, iR
9090: 6f 77 69 64 2c 20 26 69 43 65 6c 6c 29 3b 0a 20  owid, &iCell);. 
90a0: 20 20 20 20 20 70 2d 3e 69 43 65 6c 6c 20 3d 20       p->iCell = 
90b0: 28 75 38 29 69 43 65 6c 6c 3b 0a 20 20 20 20 20  (u8)iCell;.     
90c0: 20 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41   RTREE_QUEUE_TRA
90d0: 43 45 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46  CE(pCsr, "PUSH-F
90e0: 31 3a 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  1:");.    }else{
90f0: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 74 45  .      pCsr->atE
9100: 4f 46 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  OF = 1;.    }.  
9110: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 6f  }else{.    /* No
9120: 72 6d 61 6c 20 63 61 73 65 20 2d 20 72 2d 74 72  rmal case - r-tr
9130: 65 65 20 73 63 61 6e 2e 20 53 65 74 20 75 70 20  ee scan. Set up 
9140: 74 68 65 20 52 74 72 65 65 43 75 72 73 6f 72 2e  the RtreeCursor.
9150: 61 43 6f 6e 73 74 72 61 69 6e 74 20 61 72 72 61  aConstraint arra
9160: 79 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  y .    ** with t
9170: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63 6f  he configured co
9180: 6e 73 74 72 61 69 6e 74 73 2e 20 0a 20 20 20 20  nstraints. .    
9190: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6e 6f 64 65  */.    rc = node
91a0: 41 63 71 75 69 72 65 28 70 52 74 72 65 65 2c 20  Acquire(pRtree, 
91b0: 31 2c 20 30 2c 20 26 70 52 6f 6f 74 29 3b 0a 20  1, 0, &pRoot);. 
91c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
91d0: 45 5f 4f 4b 20 26 26 20 69 64 78 4e 75 6d 3c 3d  E_OK && idxNum<=
91e0: 33 20 29 7b 0a 20 20 20 20 20 20 52 74 72 65 65  3 ){.      Rtree
91f0: 43 6f 6f 72 64 20 62 62 6f 78 5b 34 5d 3b 0a 20  Coord bbox[4];. 
9200: 20 20 20 20 20 52 74 72 65 65 43 6f 6e 73 74 72       RtreeConstr
9210: 61 69 6e 74 20 2a 70 3b 0a 20 20 20 20 20 20 61  aint *p;.      a
9220: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
9230: 3b 0a 20 20 20 20 20 20 67 65 6f 70 6f 6c 79 42  ;.      geopolyB
9240: 42 6f 78 28 30 2c 20 61 72 67 76 5b 30 5d 2c 20  Box(0, argv[0], 
9250: 62 62 6f 78 2c 20 26 72 63 29 3b 0a 20 20 20 20  bbox, &rc);.    
9260: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9270: 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79      goto geopoly
9280: 5f 66 69 6c 74 65 72 5f 65 6e 64 3b 0a 20 20 20  _filter_end;.   
9290: 20 20 20 7d 0a 20 20 20 20 20 20 70 43 73 72 2d     }.      pCsr-
92a0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
92b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
92c0: 63 28 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f  c(sizeof(RtreeCo
92d0: 6e 73 74 72 61 69 6e 74 29 2a 34 29 3b 0a 20 20  nstraint)*4);.  
92e0: 20 20 20 20 70 43 73 72 2d 3e 6e 43 6f 6e 73 74      pCsr->nConst
92f0: 72 61 69 6e 74 20 3d 20 34 3b 0a 20 20 20 20 20  raint = 4;.     
9300: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
9310: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9320: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
9330: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
9340: 73 65 74 28 70 43 73 72 2d 3e 61 43 6f 6e 73 74  set(pCsr->aConst
9350: 72 61 69 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66  raint, 0, sizeof
9360: 28 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74  (RtreeConstraint
9370: 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  )*4);.        me
9380: 6d 73 65 74 28 70 43 73 72 2d 3e 61 6e 51 75 65  mset(pCsr->anQue
9390: 75 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33  ue, 0, sizeof(u3
93a0: 32 29 2a 28 70 52 74 72 65 65 2d 3e 69 44 65 70  2)*(pRtree->iDep
93b0: 74 68 20 2b 20 31 29 29 3b 0a 20 20 20 20 20 20  th + 1));.      
93c0: 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 32 20    if( idxNum==2 
93d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
93e0: 4f 76 65 72 6c 61 70 20 71 75 65 72 79 20 2a 2f  Overlap query */
93f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  .          p->op
9400: 20 3d 20 27 42 27 3b 0a 20 20 20 20 20 20 20 20   = 'B';.        
9410: 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 30 3b    p->iCoord = 0;
9420: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e  .          p->u.
9430: 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 31 5d  rValue = bbox[1]
9440: 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b  .f;.          p+
9450: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  +;.          p->
9460: 6f 70 20 3d 20 27 44 27 3b 0a 20 20 20 20 20 20  op = 'D';.      
9470: 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20      p->iCoord = 
9480: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
9490: 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b  u.rValue = bbox[
94a0: 30 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20  0].f;.          
94b0: 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  p++;.          p
94c0: 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a 20 20 20 20  ->op = 'B';.    
94d0: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20        p->iCoord 
94e0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 2;.          p
94f0: 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f  ->u.rValue = bbo
9500: 78 5b 33 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20  x[3].f;.        
9510: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    p++;.         
9520: 20 70 2d 3e 6f 70 20 3d 20 27 44 27 3b 0a 20 20   p->op = 'D';.  
9530: 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72          p->iCoor
9540: 64 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  d = 3;.         
9550: 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62   p->u.rValue = b
9560: 62 6f 78 5b 32 5d 2e 66 3b 0a 20 20 20 20 20 20  box[2].f;.      
9570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9580: 20 20 20 2f 2a 20 57 69 74 68 69 6e 20 71 75 65     /* Within que
9590: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ry */.          
95a0: 70 2d 3e 6f 70 20 3d 20 27 44 27 3b 0a 20 20 20  p->op = 'D';.   
95b0: 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64         p->iCoord
95c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
95d0: 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20 62 62  p->u.rValue = bb
95e0: 6f 78 5b 30 5d 2e 66 3b 0a 20 20 20 20 20 20 20  ox[0].f;.       
95f0: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20     p++;.        
9600: 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a 20    p->op = 'B';. 
9610: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f           p->iCoo
9620: 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rd = 1;.        
9630: 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20    p->u.rValue = 
9640: 62 62 6f 78 5b 31 5d 2e 66 3b 0a 20 20 20 20 20  bbox[1].f;.     
9650: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
9660: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 44 27 3b      p->op = 'D';
9670: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43  .          p->iC
9680: 6f 6f 72 64 20 3d 20 32 3b 0a 20 20 20 20 20 20  oord = 2;.      
9690: 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20      p->u.rValue 
96a0: 3d 20 62 62 6f 78 5b 32 5d 2e 66 3b 0a 20 20 20  = bbox[2].f;.   
96b0: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
96c0: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42        p->op = 'B
96d0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ';.          p->
96e0: 69 43 6f 6f 72 64 20 3d 20 33 3b 0a 20 20 20 20  iCoord = 3;.    
96f0: 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75        p->u.rValu
9700: 65 20 3d 20 62 62 6f 78 5b 33 5d 2e 66 3b 0a 20  e = bbox[3].f;. 
9710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9730: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9740: 20 20 20 20 20 20 52 74 72 65 65 53 65 61 72 63        RtreeSearc
9750: 68 50 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20  hPoint *pNew;.  
9760: 20 20 20 20 70 4e 65 77 20 3d 20 72 74 72 65 65      pNew = rtree
9770: 53 65 61 72 63 68 50 6f 69 6e 74 4e 65 77 28 70  SearchPointNew(p
9780: 43 73 72 2c 20 52 54 52 45 45 5f 5a 45 52 4f 2c  Csr, RTREE_ZERO,
9790: 20 28 75 38 29 28 70 52 74 72 65 65 2d 3e 69 44   (u8)(pRtree->iD
97a0: 65 70 74 68 2b 31 29 29 3b 0a 20 20 20 20 20 20  epth+1));.      
97b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
97c0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
97d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
97e0: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 5f 66    goto geopoly_f
97f0: 69 6c 74 65 72 5f 65 6e 64 3b 0a 20 20 20 20 20  ilter_end;.     
9800: 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69   }.      pNew->i
9810: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  d = 1;.      pNe
9820: 77 2d 3e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  w->iCell = 0;.  
9830: 20 20 20 20 70 4e 65 77 2d 3e 65 57 69 74 68 69      pNew->eWithi
9840: 6e 20 3d 20 50 41 52 54 4c 59 5f 57 49 54 48 49  n = PARTLY_WITHI
9850: 4e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N;.      assert(
9860: 20 70 43 73 72 2d 3e 62 50 6f 69 6e 74 3d 3d 31   pCsr->bPoint==1
9870: 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e   );.      pCsr->
9880: 61 4e 6f 64 65 5b 30 5d 20 3d 20 70 52 6f 6f 74  aNode[0] = pRoot
9890: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  ;.      pRoot = 
98a0: 30 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51  0;.      RTREE_Q
98b0: 55 45 55 45 5f 54 52 41 43 45 28 70 43 73 72 2c  UEUE_TRACE(pCsr,
98c0: 20 22 50 55 53 48 2d 46 6d 3a 22 29 3b 0a 20 20   "PUSH-Fm:");.  
98d0: 20 20 20 20 72 63 20 3d 20 72 74 72 65 65 53 74      rc = rtreeSt
98e0: 65 70 54 6f 4c 65 61 66 28 70 43 73 72 29 3b 0a  epToLeaf(pCsr);.
98f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 67 65 6f 70 6f      }.  }..geopo
9900: 6c 79 5f 66 69 6c 74 65 72 5f 65 6e 64 3a 0a 20  ly_filter_end:. 
9910: 20 6e 6f 64 65 52 65 6c 65 61 73 65 28 70 52 74   nodeRelease(pRt
9920: 72 65 65 2c 20 70 52 6f 6f 74 29 3b 0a 20 20 72  ree, pRoot);.  r
9930: 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74 72  treeRelease(pRtr
9940: 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ee);.  return rc
9950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 74 72 65 65  ;.}../*.** Rtree
9960: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
9970: 6f 64 75 6c 65 20 78 42 65 73 74 49 6e 64 65 78  odule xBestIndex
9980: 20 6d 65 74 68 6f 64 2e 20 54 68 65 72 65 20 61   method. There a
9990: 72 65 20 74 68 72 65 65 0a 2a 2a 20 74 61 62 6c  re three.** tabl
99a0: 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 69 65  e scan strategie
99b0: 73 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d  s to choose from
99c0: 20 28 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20   (in order from 
99d0: 6d 6f 73 74 20 74 6f 20 0a 2a 2a 20 6c 65 61 73  most to .** leas
99e0: 74 20 64 65 73 69 72 61 62 6c 65 29 3a 0a 2a 2a  t desirable):.**
99f0: 0a 2a 2a 20 20 20 69 64 78 4e 75 6d 20 20 20 20  .**   idxNum    
9a00: 20 69 64 78 53 74 72 20 20 20 20 20 20 20 20 53   idxStr        S
9a10: 74 72 61 74 65 67 79 0a 2a 2a 20 20 20 2d 2d 2d  trategy.**   ---
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9a50: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 22 72       1        "r
9a60: 6f 77 69 64 22 20 20 20 20 20 20 20 44 69 72 65  owid"       Dire
9a70: 63 74 20 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77  ct lookup by row
9a80: 69 64 2e 0a 2a 2a 20 20 20 20 20 32 20 20 20 20  id..**     2    
9a90: 20 20 20 20 22 72 74 72 65 65 22 20 20 20 20 20      "rtree"     
9aa0: 20 20 52 2d 74 72 65 65 20 6f 76 65 72 6c 61 70    R-tree overlap
9ab0: 20 71 75 65 72 79 20 75 73 69 6e 67 20 67 65 6f   query using geo
9ac0: 70 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 29 0a 2a  poly_overlap().*
9ad0: 2a 20 20 20 20 20 33 20 20 20 20 20 20 20 20 22  *     3        "
9ae0: 72 74 72 65 65 22 20 20 20 20 20 20 20 52 2d 74  rtree"       R-t
9af0: 72 65 65 20 77 69 74 68 69 6e 20 71 75 65 72 79  ree within query
9b00: 20 75 73 69 6e 67 20 67 65 6f 70 6f 6c 79 5f 77   using geopoly_w
9b10: 69 74 68 69 6e 28 29 0a 2a 2a 20 20 20 20 20 34  ithin().**     4
9b20: 20 20 20 20 20 20 20 20 22 66 75 6c 6c 73 63 61          "fullsca
9b30: 6e 22 20 20 20 20 66 75 6c 6c 2d 74 61 62 6c 65  n"    full-table
9b40: 20 73 63 61 6e 2e 0a 2a 2a 20 20 20 2d 2d 2d 2d   scan..**   ----
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2f 0a  ------------.*/.
9b80: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f  static int geopo
9b90: 6c 79 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69  lyBestIndex(sqli
9ba0: 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73  te3_vtab *tab, s
9bb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
9bc0: 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
9bd0: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 69 52  int ii;.  int iR
9be0: 6f 77 69 64 54 65 72 6d 20 3d 20 2d 31 3b 0a 20  owidTerm = -1;. 
9bf0: 20 69 6e 74 20 69 46 75 6e 63 54 65 72 6d 20 3d   int iFuncTerm =
9c00: 20 2d 31 3b 0a 20 20 69 6e 74 20 69 64 78 4e 75   -1;.  int idxNu
9c10: 6d 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 69  m = 0;..  for(ii
9c20: 3d 30 3b 20 69 69 3c 70 49 64 78 49 6e 66 6f 2d  =0; ii<pIdxInfo-
9c30: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 69  >nConstraint; ii
9c40: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9c50: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
9c60: 6e 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70  nstraint *p = &p
9c70: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
9c80: 61 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  aint[ii];.    if
9c90: 28 20 21 70 2d 3e 75 73 61 62 6c 65 20 29 20 63  ( !p->usable ) c
9ca0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
9cb0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26   p->iColumn<0 &&
9cc0: 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49   p->op==SQLITE_I
9cd0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9ce0: 45 51 20 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  EQ  ){.      iRo
9cf0: 77 69 64 54 65 72 6d 20 3d 20 69 69 3b 0a 20 20  widTerm = ii;.  
9d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9d10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c  .    if( p->iCol
9d20: 75 6d 6e 3d 3d 30 20 26 26 20 70 2d 3e 6f 70 3e  umn==0 && p->op>
9d30: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
9d40: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
9d50: 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 2d  N ){.      /* p-
9d60: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
9d70: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  X_CONSTRAINT_FUN
9d80: 43 54 49 4f 4e 20 66 6f 72 20 67 65 6f 70 6f 6c  CTION for geopol
9d90: 79 5f 6f 76 65 72 6c 61 70 28 29 0a 20 20 20 20  y_overlap().    
9da0: 20 20 2a 2a 20 70 2d 3e 6f 70 3d 3d 28 53 51 4c    ** p->op==(SQL
9db0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 54 52 41  ITE_INDEX_CONTRA
9dc0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 2b 31 29 20  INT_FUNCTION+1) 
9dd0: 66 6f 72 20 67 65 6f 70 6f 6c 79 5f 77 69 74 68  for geopoly_with
9de0: 69 6e 28 29 2e 0a 20 20 20 20 20 20 2a 2a 20 53  in()..      ** S
9df0: 65 65 20 67 65 6f 70 6f 6c 79 46 69 6e 64 46 75  ee geopolyFindFu
9e00: 6e 63 74 69 6f 6e 28 29 20 2a 2f 0a 20 20 20 20  nction() */.    
9e10: 20 20 69 46 75 6e 63 54 65 72 6d 20 3d 20 69 69    iFuncTerm = ii
9e20: 3b 0a 20 20 20 20 20 20 69 64 78 4e 75 6d 20 3d  ;.      idxNum =
9e30: 20 70 2d 3e 6f 70 20 2d 20 53 51 4c 49 54 45 5f   p->op - SQLITE_
9e40: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
9e50: 5f 46 55 4e 43 54 49 4f 4e 20 2b 20 32 3b 0a 20  _FUNCTION + 2;. 
9e60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
9e70: 69 52 6f 77 69 64 54 65 72 6d 3e 3d 30 20 29 7b  iRowidTerm>=0 ){
9e80: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
9e90: 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 70  dxNum = 1;.    p
9ea0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
9eb0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 70  = "rowid";.    p
9ec0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
9ed0: 61 69 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64  aintUsage[iRowid
9ee0: 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
9ef0: 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
9f00: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
9f10: 61 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e  age[iRowidTerm].
9f20: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49  omit = 1;.    pI
9f30: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
9f40: 64 43 6f 73 74 20 3d 20 33 30 2e 30 3b 0a 20 20  dCost = 30.0;.  
9f50: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
9f60: 6d 61 74 65 64 52 6f 77 73 20 3d 20 31 3b 0a 20  matedRows = 1;. 
9f70: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
9f80: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 49  Flags = SQLITE_I
9f90: 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
9fa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9fb0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9fc0: 28 20 69 46 75 6e 63 54 65 72 6d 3e 3d 30 20 29  ( iFuncTerm>=0 )
9fd0: 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
9fe0: 69 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b  idxNum = idxNum;
9ff0: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
a000: 64 78 53 74 72 20 3d 20 22 72 74 72 65 65 22 3b  dxStr = "rtree";
a010: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
a020: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
a030: 69 46 75 6e 63 54 65 72 6d 5d 2e 61 72 67 76 49  iFuncTerm].argvI
a040: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49  ndex = 1;.    pI
a050: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
a060: 69 6e 74 55 73 61 67 65 5b 69 46 75 6e 63 54 65  intUsage[iFuncTe
a070: 72 6d 5d 2e 6f 6d 69 74 20 3d 20 30 3b 0a 20 20  rm].omit = 0;.  
a080: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
a090: 6d 61 74 65 64 43 6f 73 74 20 3d 20 33 30 30 2e  matedCost = 300.
a0a0: 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
a0b0: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d  >estimatedRows =
a0c0: 20 31 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   10;.    return 
a0d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
a0e0: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
a0f0: 6d 20 3d 20 34 3b 0a 20 20 70 49 64 78 49 6e 66  m = 4;.  pIdxInf
a100: 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22 66 75 6c  o->idxStr = "ful
a110: 6c 73 63 61 6e 22 3b 0a 20 20 70 49 64 78 49 6e  lscan";.  pIdxIn
a120: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
a130: 74 20 3d 20 33 30 30 30 30 30 30 2e 30 3b 0a 20  t = 3000000.0;. 
a140: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
a150: 61 74 65 64 52 6f 77 73 20 3d 20 31 30 30 30 30  atedRows = 10000
a160: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
a170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a  TE_OK;.}.../* .*
a180: 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72 74 75 61  * GEOPOLY virtua
a190: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
a1a0: 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2e 0a 2a  Column method..*
a1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f  /.static int geo
a1c0: 70 6f 6c 79 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  polyColumn(sqlit
a1d0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
a1e0: 63 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e  cur, sqlite3_con
a1f0: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69  text *ctx, int i
a200: 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52 74 72  ){.  Rtree *pRtr
a210: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 63 75  ee = (Rtree *)cu
a220: 72 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65  r->pVtab;.  Rtre
a230: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  eCursor *pCsr = 
a240: 28 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 63  (RtreeCursor *)c
a250: 75 72 3b 0a 20 20 52 74 72 65 65 53 65 61 72 63  ur;.  RtreeSearc
a260: 68 50 6f 69 6e 74 20 2a 70 20 3d 20 72 74 72 65  hPoint *p = rtre
a270: 65 53 65 61 72 63 68 50 6f 69 6e 74 46 69 72 73  eSearchPointFirs
a280: 74 28 70 43 73 72 29 3b 0a 20 20 69 6e 74 20 72  t(pCsr);.  int r
a290: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a2a0: 20 52 74 72 65 65 4e 6f 64 65 20 2a 70 4e 6f 64   RtreeNode *pNod
a2b0: 65 20 3d 20 72 74 72 65 65 4e 6f 64 65 4f 66 46  e = rtreeNodeOfF
a2c0: 69 72 73 74 53 65 61 72 63 68 50 6f 69 6e 74 28  irstSearchPoint(
a2d0: 70 43 73 72 2c 20 26 72 63 29 3b 0a 0a 20 20 69  pCsr, &rc);..  i
a2e0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a2f0: 63 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  c;.  if( p==0 ) 
a300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a310: 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20  ;.  if( i==0 && 
a320: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6e 6f 63  sqlite3_vtab_noc
a330: 68 61 6e 67 65 28 63 74 78 29 20 29 20 72 65 74  hange(ctx) ) ret
a340: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a350: 20 69 66 28 20 69 3c 3d 70 52 74 72 65 65 2d 3e   if( i<=pRtree->
a360: 6e 41 75 78 20 29 7b 0a 20 20 20 20 69 66 28 20  nAux ){.    if( 
a370: 21 70 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64  !pCsr->bAuxValid
a380: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
a390: 73 72 2d 3e 70 52 65 61 64 41 75 78 3d 3d 30 20  sr->pReadAux==0 
a3a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a3b0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
a3c0: 76 33 28 70 52 74 72 65 65 2d 3e 64 62 2c 20 70  v3(pRtree->db, p
a3d0: 52 74 72 65 65 2d 3e 7a 52 65 61 64 41 75 78 53  Rtree->zReadAuxS
a3e0: 71 6c 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20  ql, -1, 0,.     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 20 20 20 20 20 26 70 43 73 72             &pCsr
a410: 2d 3e 70 52 65 61 64 41 75 78 2c 20 30 29 3b 0a  ->pReadAux, 0);.
a420: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
a430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a440: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a450: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 73  3_bind_int64(pCs
a460: 72 2d 3e 70 52 65 61 64 41 75 78 2c 20 31 2c 20  r->pReadAux, 1, 
a470: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 64 65 47  .          nodeG
a480: 65 74 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20  etRowid(pRtree, 
a490: 70 4e 6f 64 65 2c 20 70 2d 3e 69 43 65 6c 6c 29  pNode, p->iCell)
a4a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
a4b0: 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
a4c0: 3e 70 52 65 61 64 41 75 78 29 3b 0a 20 20 20 20  >pReadAux);.    
a4d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a4e0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
a4f0: 70 43 73 72 2d 3e 62 41 75 78 56 61 6c 69 64 20  pCsr->bAuxValid 
a500: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
a510: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a520: 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 52  3_reset(pCsr->pR
a530: 65 61 64 41 75 78 29 3b 0a 20 20 20 20 20 20 20  eadAux);.       
a540: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a550: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
a560: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 72  TE_OK;.        r
a570: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
a580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
a590: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
a5a0: 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (ctx, sqlite3_co
a5b0: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d  lumn_value(pCsr-
a5c0: 3e 70 52 65 61 64 41 75 78 2c 20 69 2b 32 29 29  >pReadAux, i+2))
a5d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a5e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
a5f0: 0a 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65 20  .** The xUpdate 
a600: 6d 65 74 68 6f 64 20 66 6f 72 20 47 45 4f 50 4f  method for GEOPO
a610: 4c 59 20 6d 6f 64 75 6c 65 20 76 69 72 74 75 61  LY module virtua
a620: 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  l tables..**.** 
a630: 46 6f 72 20 44 45 4c 45 54 45 3a 0a 2a 2a 0a 2a  For DELETE:.**.*
a640: 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20  *     argv[0] = 
a650: 74 68 65 20 72 6f 77 69 64 20 74 6f 20 62 65 20  the rowid to be 
a660: 64 65 6c 65 74 65 64 0a 2a 2a 0a 2a 2a 20 46 6f  deleted.**.** Fo
a670: 72 20 49 4e 53 45 52 54 3a 0a 2a 2a 0a 2a 2a 20  r INSERT:.**.** 
a680: 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 53 51      argv[0] = SQ
a690: 4c 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 61 72  L NULL.**     ar
a6a0: 67 76 5b 31 5d 20 3d 20 72 6f 77 69 64 20 74 6f  gv[1] = rowid to
a6b0: 20 69 6e 73 65 72 74 2c 20 6f 72 20 61 6e 20 53   insert, or an S
a6c0: 51 4c 20 4e 55 4c 4c 20 74 6f 20 73 65 6c 65 63  QL NULL to selec
a6d0: 74 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  t automatically.
a6e0: 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20 3d  **     argv[2] =
a6f0: 20 5f 73 68 61 70 65 20 63 6f 6c 75 6d 6e 0a 2a   _shape column.*
a700: 2a 20 20 20 20 20 61 72 67 76 5b 33 5d 20 3d 20  *     argv[3] = 
a710: 66 69 72 73 74 20 61 70 70 6c 69 63 61 74 69 6f  first applicatio
a720: 6e 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  n-defined column
a730: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 55  .....**.** For U
a740: 50 44 41 54 45 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  PDATE:.**.**    
a750: 20 61 72 67 76 5b 30 5d 20 3d 20 72 6f 77 69 64   argv[0] = rowid
a760: 20 74 6f 20 6d 6f 64 69 66 79 2e 20 20 4e 65 76   to modify.  Nev
a770: 65 72 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 61  er NULL.**     a
a780: 72 67 76 5b 31 5d 20 3d 20 72 6f 77 69 64 20 61  rgv[1] = rowid a
a790: 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
a7a0: 20 20 4e 65 76 65 72 20 4e 55 4c 4c 0a 2a 2a 20    Never NULL.** 
a7b0: 20 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 6e 65      argv[2] = ne
a7c0: 77 20 76 61 6c 75 65 20 66 6f 72 20 5f 73 68 61  w value for _sha
a7d0: 70 65 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 33  pe.**     argv[3
a7e0: 5d 20 3d 20 6e 65 77 20 76 61 6c 75 65 20 66 6f  ] = new value fo
a7f0: 72 20 66 69 72 73 74 20 61 70 70 6c 69 63 61 74  r first applicat
a800: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ion-defined colu
a810: 6d 6e 2e 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  mn.....*/.static
a820: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 55 70 64 61   int geopolyUpda
a830: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  te(.  sqlite3_vt
a840: 61 62 20 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e  ab *pVtab, .  in
a850: 74 20 6e 44 61 74 61 2c 20 0a 20 20 73 71 6c 69  t nData, .  sqli
a860: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 44 61 74  te3_value **aDat
a870: 61 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  a, .  sqlite_int
a880: 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20  64 *pRowid.){.  
a890: 52 74 72 65 65 20 2a 70 52 74 72 65 65 20 3d 20  Rtree *pRtree = 
a8a0: 28 52 74 72 65 65 20 2a 29 70 56 74 61 62 3b 0a  (Rtree *)pVtab;.
a8b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a8c0: 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 43 65 6c  E_OK;.  RtreeCel
a8d0: 6c 20 63 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  l cell;         
a8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
a8f0: 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 66  ell to insert if
a900: 20 6e 44 61 74 61 3e 31 20 2a 2f 0a 20 20 69 36   nData>1 */.  i6
a910: 34 20 6f 6c 64 52 6f 77 69 64 3b 20 20 20 20 20  4 oldRowid;     
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a930: 20 54 68 65 20 6f 6c 64 20 72 6f 77 69 64 20 2a   The old rowid *
a940: 2f 0a 20 20 69 6e 74 20 6f 6c 64 52 6f 77 69 64  /.  int oldRowid
a950: 56 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  Valid;          
a960: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
a970: 6c 64 52 6f 77 69 64 20 69 73 20 76 61 6c 69 64  ldRowid is valid
a980: 20 2a 2f 0a 20 20 69 36 34 20 6e 65 77 52 6f 77   */.  i64 newRow
a990: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
a9a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
a9b0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
a9c0: 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 3b 20 20  newRowidValid;  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a9e0: 72 75 65 20 69 66 20 6e 65 77 52 6f 77 69 64 20  rue if newRowid 
a9f0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 6e  is valid */.  in
aa00: 74 20 63 6f 6f 72 64 43 68 61 6e 67 65 20 3d 20  t coordChange = 
aa10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
aa20: 20 43 68 61 6e 67 65 20 69 6e 20 63 6f 6f 72 64   Change in coord
aa30: 69 6e 61 74 65 73 20 2a 2f 0a 0a 20 20 69 66 28  inates */..  if(
aa40: 20 70 52 74 72 65 65 2d 3e 6e 4e 6f 64 65 52 65   pRtree->nNodeRe
aa50: 66 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 61 62  f ){.    /* Unab
aa60: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
aa70: 68 65 20 62 74 72 65 65 20 77 68 69 6c 65 20 61  he btree while a
aa80: 6e 6f 74 68 65 72 20 63 75 72 73 6f 72 20 69 73  nother cursor is
aa90: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 69 74   reading from it
aaa0: 2c 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 74  ,.    ** since t
aab0: 68 65 20 77 72 69 74 65 20 6d 69 67 68 74 20 64  he write might d
aac0: 6f 20 61 20 72 65 62 61 6c 61 6e 63 65 20 77 68  o a rebalance wh
aad0: 69 63 68 20 77 6f 75 6c 64 20 64 69 73 72 75 70  ich would disrup
aae0: 74 20 74 68 65 20 72 65 61 64 0a 20 20 20 20 2a  t the read.    *
aaf0: 2a 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  * cursor. */.   
ab00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
ab10: 4f 43 4b 45 44 5f 56 54 41 42 3b 0a 20 20 7d 0a  OCKED_VTAB;.  }.
ab20: 20 20 72 74 72 65 65 52 65 66 65 72 65 6e 63 65    rtreeReference
ab30: 28 70 52 74 72 65 65 29 3b 0a 20 20 61 73 73 65  (pRtree);.  asse
ab40: 72 74 28 6e 44 61 74 61 3e 3d 31 29 3b 0a 0a 20  rt(nData>=1);.. 
ab50: 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 3d   oldRowidValid =
ab60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
ab70: 79 70 65 28 61 44 61 74 61 5b 30 5d 29 21 3d 53  ype(aData[0])!=S
ab80: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 3b 0a 20 20 6f  QLITE_NULL;;.  o
ab90: 6c 64 52 6f 77 69 64 20 3d 20 6f 6c 64 52 6f 77  ldRowid = oldRow
aba0: 69 64 56 61 6c 69 64 20 3f 20 73 71 6c 69 74 65  idValid ? sqlite
abb0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44  3_value_int64(aD
abc0: 61 74 61 5b 30 5d 29 20 3a 20 30 3b 0a 20 20 6e  ata[0]) : 0;.  n
abd0: 65 77 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 6e  ewRowidValid = n
abe0: 44 61 74 61 3e 31 20 26 26 20 73 71 6c 69 74 65  Data>1 && sqlite
abf0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 44 61  3_value_type(aDa
ac00: 74 61 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  ta[1])!=SQLITE_N
ac10: 55 4c 4c 3b 0a 20 20 6e 65 77 52 6f 77 69 64 20  ULL;.  newRowid 
ac20: 3d 20 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20  = newRowidValid 
ac30: 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ? sqlite3_value_
ac40: 69 6e 74 36 34 28 61 44 61 74 61 5b 31 5d 29 20  int64(aData[1]) 
ac50: 3a 20 30 3b 0a 20 20 63 65 6c 6c 2e 69 52 6f 77  : 0;.  cell.iRow
ac60: 69 64 20 3d 20 6e 65 77 52 6f 77 69 64 3b 0a 0a  id = newRowid;..
ac70: 20 20 69 66 28 20 6e 44 61 74 61 3e 31 20 20 20    if( nData>1   
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aca0: 20 6e 6f 74 20 61 20 44 45 4c 45 54 45 20 2a 2f   not a DELETE */
acb0: 0a 20 20 20 26 26 20 28 21 6f 6c 64 52 6f 77 69  .   && (!oldRowi
acc0: 64 56 61 6c 69 64 20 20 20 20 20 20 20 20 20 20  dValid          
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ace0: 2a 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 20 20  * INSERT */.    
acf0: 20 20 20 20 7c 7c 20 21 73 71 6c 69 74 65 33 5f      || !sqlite3_
ad00: 76 61 6c 75 65 5f 6e 6f 63 68 61 6e 67 65 28 61  value_nochange(a
ad10: 44 61 74 61 5b 32 5d 29 20 20 2f 2a 20 55 50 44  Data[2])  /* UPD
ad20: 41 54 45 20 5f 73 68 61 70 65 20 2a 2f 0a 20 20  ATE _shape */.  
ad30: 20 20 20 20 20 20 7c 7c 20 6f 6c 64 52 6f 77 69        || oldRowi
ad40: 64 21 3d 6e 65 77 52 6f 77 69 64 29 20 20 20 20  d!=newRowid)    
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ad60: 6f 77 69 64 20 63 68 61 6e 67 65 20 2a 2f 0a 20  owid change */. 
ad70: 20 29 7b 0a 20 20 20 20 67 65 6f 70 6f 6c 79 42   ){.    geopolyB
ad80: 42 6f 78 28 30 2c 20 61 44 61 74 61 5b 32 5d 2c  Box(0, aData[2],
ad90: 20 63 65 6c 6c 2e 61 43 6f 6f 72 64 2c 20 26 72   cell.aCoord, &r
ada0: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
adb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
adc0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a  SQLITE_ERROR ){.
add0: 20 20 20 20 20 20 20 20 70 56 74 61 62 2d 3e 7a          pVtab->z
ade0: 45 72 72 4d 73 67 20 3d 0a 20 20 20 20 20 20 20  ErrMsg =.       
adf0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
ae00: 74 66 28 22 5f 73 68 61 70 65 20 64 6f 65 73 20  tf("_shape does 
ae10: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61  not contain a va
ae20: 6c 69 64 20 70 6f 6c 79 67 6f 6e 22 29 3b 0a 20  lid polygon");. 
ae30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
ae40: 6f 20 67 65 6f 70 6f 6c 79 5f 75 70 64 61 74 65  o geopoly_update
ae50: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
ae60: 63 6f 6f 72 64 43 68 61 6e 67 65 20 3d 20 31 3b  coordChange = 1;
ae70: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 72 6f  ..    /* If a ro
ae80: 77 69 64 20 76 61 6c 75 65 20 77 61 73 20 73 75  wid value was su
ae90: 70 70 6c 69 65 64 2c 20 63 68 65 63 6b 20 69 66  pplied, check if
aea0: 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
aeb0: 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a  resent in .    *
aec0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  * the table. If 
aed0: 73 6f 2c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  so, the constrai
aee0: 6e 74 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  nt has failed. *
aef0: 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 52 6f 77  /.    if( newRow
af00: 69 64 56 61 6c 69 64 20 26 26 20 28 21 6f 6c 64  idValid && (!old
af10: 52 6f 77 69 64 56 61 6c 69 64 20 7c 7c 20 6f 6c  RowidValid || ol
af20: 64 52 6f 77 69 64 21 3d 6e 65 77 52 6f 77 69 64  dRowid!=newRowid
af30: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  ) ){.      int s
af40: 74 65 70 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  teprc;.      sql
af50: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
af60: 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77  pRtree->pReadRow
af70: 69 64 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f 77  id, 1, cell.iRow
af80: 69 64 29 3b 0a 20 20 20 20 20 20 73 74 65 70 72  id);.      stepr
af90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
afa0: 28 70 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f  (pRtree->pReadRo
afb0: 77 69 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  wid);.      rc =
afc0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
afd0: 52 74 72 65 65 2d 3e 70 52 65 61 64 52 6f 77 69  Rtree->pReadRowi
afe0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  d);.      if( SQ
aff0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 74 65 70 72 63  LITE_ROW==steprc
b000: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b010: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f  sqlite3_vtab_on_
b020: 63 6f 6e 66 6c 69 63 74 28 70 52 74 72 65 65 2d  conflict(pRtree-
b030: 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f 52 45 50  >db)==SQLITE_REP
b040: 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LACE ){.        
b050: 20 20 72 63 20 3d 20 72 74 72 65 65 44 65 6c 65    rc = rtreeDele
b060: 74 65 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20  teRowid(pRtree, 
b070: 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20  cell.iRowid);.  
b080: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b090: 20 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65         rc = rtre
b0a0: 65 43 6f 6e 73 74 72 61 69 6e 74 45 72 72 6f 72  eConstraintError
b0b0: 28 70 52 74 72 65 65 2c 20 30 29 3b 0a 20 20 20  (pRtree, 0);.   
b0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b0d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
b0e0: 66 20 61 44 61 74 61 5b 30 5d 20 69 73 20 6e 6f  f aData[0] is no
b0f0: 74 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61  t an SQL NULL va
b100: 6c 75 65 2c 20 69 74 20 69 73 20 74 68 65 20 72  lue, it is the r
b110: 6f 77 69 64 20 6f 66 20 61 0a 20 20 2a 2a 20 72  owid of a.  ** r
b120: 65 63 6f 72 64 20 74 6f 20 64 65 6c 65 74 65 20  ecord to delete 
b130: 66 72 6f 6d 20 74 68 65 20 72 2d 74 72 65 65 20  from the r-tree 
b140: 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  table. The follo
b150: 77 69 6e 67 20 62 6c 6f 63 6b 20 64 6f 65 73 0a  wing block does.
b160: 20 20 2a 2a 20 6a 75 73 74 20 74 68 61 74 2e 0a    ** just that..
b170: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
b180: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 44 61  QLITE_OK && (nDa
b190: 74 61 3d 3d 31 20 7c 7c 20 28 63 6f 6f 72 64 43  ta==1 || (coordC
b1a0: 68 61 6e 67 65 20 26 26 20 6f 6c 64 52 6f 77 69  hange && oldRowi
b1b0: 64 56 61 6c 69 64 29 29 20 29 7b 0a 20 20 20 20  dValid)) ){.    
b1c0: 72 63 20 3d 20 72 74 72 65 65 44 65 6c 65 74 65  rc = rtreeDelete
b1d0: 52 6f 77 69 64 28 70 52 74 72 65 65 2c 20 6f 6c  Rowid(pRtree, ol
b1e0: 64 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20  dRowid);.  }..  
b1f0: 2f 2a 20 49 66 20 74 68 65 20 61 44 61 74 61 5b  /* If the aData[
b200: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
b210: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
b220: 6c 65 6d 65 6e 74 2c 20 65 6c 65 6d 65 6e 74 73  lement, elements
b230: 0a 20 20 2a 2a 20 28 61 44 61 74 61 5b 32 5d 2e  .  ** (aData[2].
b240: 2e 61 44 61 74 61 5b 61 72 67 63 2d 31 5d 29 20  .aData[argc-1]) 
b250: 63 6f 6e 74 61 69 6e 20 61 20 6e 65 77 20 72 65  contain a new re
b260: 63 6f 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69  cord to insert i
b270: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 72 2d 74  nto.  ** the r-t
b280: 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  ree structure.. 
b290: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
b2a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61  LITE_OK && nData
b2b0: 3e 31 20 26 26 20 63 6f 6f 72 64 43 68 61 6e 67  >1 && coordChang
b2c0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  e ){.    /* Inse
b2d0: 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  rt the new recor
b2e0: 64 20 69 6e 74 6f 20 74 68 65 20 72 2d 74 72 65  d into the r-tre
b2f0: 65 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f  e */.    RtreeNo
b300: 64 65 20 2a 70 4c 65 61 66 20 3d 20 30 3b 0a 20  de *pLeaf = 0;. 
b310: 20 20 20 69 66 28 20 21 6e 65 77 52 6f 77 69 64     if( !newRowid
b320: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Valid ){.      r
b330: 63 20 3d 20 72 74 72 65 65 4e 65 77 52 6f 77 69  c = rtreeNewRowi
b340: 64 28 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2e  d(pRtree, &cell.
b350: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iRowid);.    }. 
b360: 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 63 65 6c     *pRowid = cel
b370: 6c 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66  l.iRowid;.    if
b380: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b390: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 43 68  ){.      rc = Ch
b3a0: 6f 6f 73 65 4c 65 61 66 28 70 52 74 72 65 65 2c  ooseLeaf(pRtree,
b3b0: 20 26 63 65 6c 6c 2c 20 30 2c 20 26 70 4c 65 61   &cell, 0, &pLea
b3c0: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  f);.    }.    if
b3d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b3e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
b3f0: 3b 0a 20 20 20 20 20 20 70 52 74 72 65 65 2d 3e  ;.      pRtree->
b400: 69 52 65 69 6e 73 65 72 74 48 65 69 67 68 74 20  iReinsertHeight 
b410: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d  = -1;.      rc =
b420: 20 72 74 72 65 65 49 6e 73 65 72 74 43 65 6c 6c   rtreeInsertCell
b430: 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66 2c 20  (pRtree, pLeaf, 
b440: 26 63 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  &cell, 0);.     
b450: 20 72 63 32 20 3d 20 6e 6f 64 65 52 65 6c 65 61   rc2 = nodeRelea
b460: 73 65 28 70 52 74 72 65 65 2c 20 70 4c 65 61 66  se(pRtree, pLeaf
b470: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b490: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
b4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b4b0: 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
b4c0: 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 66 28  he data */.  if(
b4d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b4e0: 26 20 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20  & nData>1 ){.   
b4f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
b500: 55 70 20 3d 20 70 52 74 72 65 65 2d 3e 70 57 72  Up = pRtree->pWr
b510: 69 74 65 41 75 78 3b 0a 20 20 20 20 69 6e 74 20  iteAux;.    int 
b520: 6a 6a 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 61  jj;.    int nCha
b530: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nge = 0;.    sql
b540: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
b550: 70 55 70 2c 20 31 2c 20 63 65 6c 6c 2e 69 52 6f  pUp, 1, cell.iRo
b560: 77 69 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wid);.    assert
b570: 28 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 3e 3d  ( pRtree->nAux>=
b580: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  1 );.    if( sql
b590: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61  ite3_value_nocha
b5a0: 6e 67 65 28 61 44 61 74 61 5b 32 5d 29 20 29 7b  nge(aData[2]) ){
b5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
b5c0: 69 6e 64 5f 6e 75 6c 6c 28 70 55 70 2c 20 32 29  ind_null(pUp, 2)
b5d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b5e0: 20 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20     GeoPoly *p = 
b5f0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
b600: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
b610: 61 44 61 74 61 5b 32 5d 29 3d 3d 53 51 4c 49 54  aData[2])==SQLIT
b620: 45 5f 54 45 58 54 0a 20 20 20 20 20 20 20 26 26  E_TEXT.       &&
b630: 20 28 70 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e   (p = geopolyFun
b640: 63 50 61 72 61 6d 28 30 2c 20 61 44 61 74 61 5b  cParam(0, aData[
b650: 32 5d 2c 20 26 72 63 29 29 21 3d 30 0a 20 20 20  2], &rc))!=0.   
b660: 20 20 20 20 26 26 20 72 63 3d 3d 53 51 4c 49 54      && rc==SQLIT
b670: 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
b680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
b690: 6e 64 5f 62 6c 6f 62 28 70 55 70 2c 20 32 2c 20  nd_blob(pUp, 2, 
b6a0: 70 2d 3e 68 64 72 2c 20 34 2b 38 2a 70 2d 3e 6e  p->hdr, 4+8*p->n
b6b0: 56 65 72 74 65 78 2c 20 53 51 4c 49 54 45 5f 54  Vertex, SQLITE_T
b6c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
b6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b6e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
b6f0: 75 65 28 70 55 70 2c 20 32 2c 20 61 44 61 74 61  ue(pUp, 2, aData
b700: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
b710: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b720: 28 70 29 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e  (p);.      nChan
b730: 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge = 1;.    }.  
b740: 20 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 70    for(jj=1; jj<p
b750: 52 74 72 65 65 2d 3e 6e 41 75 78 3b 20 6a 6a 2b  Rtree->nAux; jj+
b760: 2b 29 7b 0a 20 20 20 20 20 20 6e 43 68 61 6e 67  +){.      nChang
b770: 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
b780: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
b790: 70 2c 20 6a 6a 2b 32 2c 20 61 44 61 74 61 5b 6a  p, jj+2, aData[j
b7a0: 6a 2b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  j+2]);.    }.   
b7b0: 20 69 66 28 20 6e 43 68 61 6e 67 65 20 29 7b 0a   if( nChange ){.
b7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b7d0: 65 70 28 70 55 70 29 3b 0a 20 20 20 20 20 20 72  ep(pUp);.      r
b7e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
b7f0: 74 28 70 55 70 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pUp);.    }.  
b800: 7d 0a 0a 67 65 6f 70 6f 6c 79 5f 75 70 64 61 74  }..geopoly_updat
b810: 65 5f 65 6e 64 3a 0a 20 20 72 74 72 65 65 52 65  e_end:.  rtreeRe
b820: 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20  lease(pRtree);. 
b830: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b840: 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 61 74  *.** Report that
b850: 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70   geopoly_overlap
b860: 28 29 20 69 73 20 61 6e 20 6f 76 65 72 6c 6f 61  () is an overloa
b870: 64 65 64 20 66 75 6e 63 74 69 6f 6e 20 73 75 69  ded function sui
b880: 74 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 75 73 65  table.** for use
b890: 20 69 6e 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   in xBestIndex..
b8a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b8b0: 6f 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69 6f  opolyFindFunctio
b8c0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
b8d0: 62 20 2a 70 56 74 61 62 2c 0a 20 20 69 6e 74 20  b *pVtab,.  int 
b8e0: 6e 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nArg,.  const ch
b8f0: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 76 6f 69  ar *zName,.  voi
b900: 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
b910: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
b920: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
b930: 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41  *),.  void **ppA
b940: 72 67 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  rg.){.  if( sqli
b950: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
b960: 65 2c 20 22 67 65 6f 70 6f 6c 79 5f 6f 76 65 72  e, "geopoly_over
b970: 6c 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lap")==0 ){.    
b980: 2a 70 78 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c  *pxFunc = geopol
b990: 79 4f 76 65 72 6c 61 70 46 75 6e 63 3b 0a 20 20  yOverlapFunc;.  
b9a0: 20 20 2a 70 70 41 72 67 20 3d 20 30 3b 0a 20 20    *ppArg = 0;.  
b9b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b9c0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b9d0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 7d 0a 20  _FUNCTION;.  }. 
b9e0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
b9f0: 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 67 65 6f  icmp(zName, "geo
ba00: 70 6f 6c 79 5f 77 69 74 68 69 6e 22 29 3d 3d 30  poly_within")==0
ba10: 20 29 7b 0a 20 20 20 20 2a 70 78 46 75 6e 63 20   ){.    *pxFunc 
ba20: 3d 20 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46  = geopolyWithinF
ba30: 75 6e 63 3b 0a 20 20 20 20 2a 70 70 41 72 67 20  unc;.    *ppArg 
ba40: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
ba50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ba60: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
ba70: 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +1;.  }.  return
ba80: 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73   0;.}...static s
ba90: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 67 65  qlite3_module ge
baa0: 6f 70 6f 6c 79 4d 6f 64 75 6c 65 20 3d 20 7b 0a  opolyModule = {.
bab0: 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bad0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 67   iVersion */.  g
bae0: 65 6f 70 6f 6c 79 43 72 65 61 74 65 2c 20 20 20  eopolyCreate,   
baf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
bb00: 72 65 61 74 65 20 2d 20 63 72 65 61 74 65 20 61  reate - create a
bb10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67 65 6f 70   table */.  geop
bb20: 6f 6c 79 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  olyConnect,     
bb30: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
bb40: 65 63 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f  ect - connect to
bb50: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
bb60: 6c 65 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 42  le */.  geopolyB
bb70: 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
bb80: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
bb90: 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65  x - Determine se
bba0: 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f  arch strategy */
bbb0: 0a 20 20 72 74 72 65 65 44 69 73 63 6f 6e 6e 65  .  rtreeDisconne
bbc0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
bbd0: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20  * xDisconnect - 
bbe0: 44 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20  Disconnect from 
bbf0: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 74 72  a table */.  rtr
bc00: 65 65 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  eeDestroy,      
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
bc20: 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
bc30: 62 6c 65 20 2a 2f 0a 20 20 72 74 72 65 65 4f 70  ble */.  rtreeOp
bc40: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
bc50: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
bc60: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
bc70: 0a 20 20 72 74 72 65 65 43 6c 6f 73 65 2c 20 20  .  rtreeClose,  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc90: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
bca0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 67   a cursor */.  g
bcb0: 65 6f 70 6f 6c 79 46 69 6c 74 65 72 2c 20 20 20  eopolyFilter,   
bcc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
bcd0: 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
bce0: 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
bcf0: 74 73 20 2a 2f 0a 20 20 72 74 72 65 65 4e 65 78  ts */.  rtreeNex
bd00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
bd10: 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
bd20: 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
bd30: 2a 2f 0a 20 20 72 74 72 65 65 45 6f 66 2c 20 20  */.  rtreeEof,  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 67 65   /* xEof */.  ge
bd60: 6f 70 6f 6c 79 43 6f 6c 75 6d 6e 2c 20 20 20 20  opolyColumn,    
bd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
bd80: 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
bd90: 20 2a 2f 0a 20 20 72 74 72 65 65 52 6f 77 69 64   */.  rtreeRowid
bda0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bdb0: 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
bdc0: 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 67 65 6f  ad data */.  geo
bdd0: 70 6f 6c 79 55 70 64 61 74 65 2c 20 20 20 20 20  polyUpdate,     
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
bdf0: 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61  ate - write data
be00: 20 2a 2f 0a 20 20 72 74 72 65 65 42 65 67 69 6e   */.  rtreeBegin
be10: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
be20: 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
be30: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
be40: 2a 2f 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61  */.  rtreeEndTra
be50: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  nsaction,       
be60: 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e 63   /* xSync - sync
be70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
be80: 20 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73 61    rtreeEndTransa
be90: 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a  ction,        /*
bea0: 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d 6d 69   xCommit - commi
beb0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  t transaction */
bec0: 0a 20 20 72 74 72 65 65 45 6e 64 54 72 61 6e 73  .  rtreeEndTrans
bed0: 61 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 2f  action,        /
bee0: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f  * xRollback - ro
bef0: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
bf00: 6f 6e 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 46  on */.  geopolyF
bf10: 69 6e 64 46 75 6e 63 74 69 6f 6e 2c 20 20 20 20  indFunction,    
bf20: 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63      /* xFindFunc
bf30: 74 69 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20  tion - function 
bf40: 6f 76 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20  overloading */. 
bf50: 20 72 74 72 65 65 52 65 6e 61 6d 65 2c 20 20 20   rtreeRename,   
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf70: 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65  xRename - rename
bf80: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
bf90: 72 74 72 65 65 53 61 76 65 70 6f 69 6e 74 2c 20  rtreeSavepoint, 
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
bfb0: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
bfc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
bfe0: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20  elease */.  0,  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
c010: 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 73 74  backTo */.};..st
c020: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c030: 5f 67 65 6f 70 6f 6c 79 5f 69 6e 69 74 28 73 71  _geopoly_init(sq
c040: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
c050: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c060: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
c070: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 76 6f   struct {.    vo
c080: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
c090: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c0a0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c0b0: 29 3b 0a 20 20 20 20 73 69 67 6e 65 64 20 63 68  );.    signed ch
c0c0: 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 75 6e 73  ar nArg;.    uns
c0d0: 69 67 6e 65 64 20 63 68 61 72 20 62 50 75 72 65  igned char bPure
c0e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c0f0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 7d 20 61 46 75   *zName;.  } aFu
c100: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  nc[] = {.     { 
c110: 67 65 6f 70 6f 6c 79 41 72 65 61 46 75 6e 63 2c  geopolyAreaFunc,
c120: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
c130: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 61 72 65 61     "geopoly_area
c140: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
c150: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42  .     { geopolyB
c160: 6c 6f 62 46 75 6e 63 2c 20 20 20 20 20 20 20 20  lobFunc,        
c170: 20 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    1, 1,    "geop
c180: 6f 6c 79 5f 62 6c 6f 62 22 20 20 20 20 20 20 20  oly_blob"       
c190: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
c1a0: 67 65 6f 70 6f 6c 79 4a 73 6f 6e 46 75 6e 63 2c  geopolyJsonFunc,
c1b0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
c1c0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 6a 73 6f 6e     "geopoly_json
c1d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
c1e0: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 53  .     { geopolyS
c1f0: 76 67 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  vgFunc,         
c200: 20 2d 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70   -1, 1,    "geop
c210: 6f 6c 79 5f 73 76 67 22 20 20 20 20 20 20 20 20  oly_svg"        
c220: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
c230: 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75 6e  geopolyWithinFun
c240: 63 2c 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20  c,        2, 1, 
c250: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 77 69 74 68     "geopoly_with
c260: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  in"           },
c270: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 43  .     { geopolyC
c280: 6f 6e 74 61 69 6e 73 50 6f 69 6e 74 46 75 6e 63  ontainsPointFunc
c290: 2c 20 33 2c 20 31 2c 20 20 20 20 22 67 65 6f 70  , 3, 1,    "geop
c2a0: 6f 6c 79 5f 63 6f 6e 74 61 69 6e 73 5f 70 6f 69  oly_contains_poi
c2b0: 6e 74 22 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt"   },.     { 
c2c0: 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 46 75  geopolyOverlapFu
c2d0: 6e 63 2c 20 20 20 20 20 20 20 32 2c 20 31 2c 20  nc,       2, 1, 
c2e0: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 6f 76 65 72     "geopoly_over
c2f0: 6c 61 70 22 20 20 20 20 20 20 20 20 20 20 7d 2c  lap"          },
c300: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 44  .     { geopolyD
c310: 65 62 75 67 46 75 6e 63 2c 20 20 20 20 20 20 20  ebugFunc,       
c320: 20 20 31 2c 20 30 2c 20 20 20 20 22 67 65 6f 70    1, 0,    "geop
c330: 6f 6c 79 5f 64 65 62 75 67 22 20 20 20 20 20 20  oly_debug"      
c340: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
c350: 67 65 6f 70 6f 6c 79 42 42 6f 78 46 75 6e 63 2c  geopolyBBoxFunc,
c360: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
c370: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 62 62 6f 78     "geopoly_bbox
c380: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
c390: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 58  .     { geopolyX
c3a0: 66 6f 72 6d 46 75 6e 63 2c 20 20 20 20 20 20 20  formFunc,       
c3b0: 20 20 37 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    7, 1,    "geop
c3c0: 6f 6c 79 5f 78 66 6f 72 6d 22 20 20 20 20 20 20  oly_xform"      
c3d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
c3e0: 67 65 6f 70 6f 6c 79 52 65 67 75 6c 61 72 46 75  geopolyRegularFu
c3f0: 6e 63 2c 20 20 20 20 20 20 20 34 2c 20 31 2c 20  nc,       4, 1, 
c400: 20 20 20 22 67 65 6f 70 6f 6c 79 5f 72 65 67 75     "geopoly_regu
c410: 6c 61 72 22 20 20 20 20 20 20 20 20 20 20 7d 2c  lar"          },
c420: 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 52  .     { geopolyR
c430: 65 76 65 72 73 65 46 75 6e 63 2c 20 20 20 20 20  everseFunc,     
c440: 20 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70    1, 1,    "geop
c450: 6f 6c 79 5f 72 65 76 65 72 73 65 22 20 20 20 20  oly_reverse"    
c460: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
c470: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
c480: 75 63 74 20 7b 0a 20 20 20 20 76 6f 69 64 20 28  uct {.    void (
c490: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
c4a0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
c4b0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
c4c0: 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c     void (*xFinal
c4d0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c4e0: 74 2a 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t*);.    const c
c4f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 7d 20  har *zName;.  } 
c500: 61 41 67 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  aAgg[] = {.     
c510: 7b 20 67 65 6f 70 6f 6c 79 42 42 6f 78 53 74 65  { geopolyBBoxSte
c520: 70 2c 20 67 65 6f 70 6f 6c 79 42 42 6f 78 46 69  p, geopolyBBoxFi
c530: 6e 61 6c 2c 20 22 67 65 6f 70 6f 6c 79 5f 67 72  nal, "geopoly_gr
c540: 6f 75 70 5f 62 62 6f 78 22 20 20 20 20 7d 2c 0a  oup_bbox"    },.
c550: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
c560: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
c570: 66 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28  f(aFunc)/sizeof(
c580: 61 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d  aFunc[0]) && rc=
c590: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
c5a0: 7b 0a 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20  {.    int enc = 
c5b0: 61 46 75 6e 63 5b 69 5d 2e 62 50 75 72 65 20 3f  aFunc[i].bPure ?
c5c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
c5d0: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
c5e0: 43 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  C : SQLITE_UTF8;
c5f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c600: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c610: 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a  n(db, aFunc[i].z
c620: 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e  Name, aFunc[i].n
c630: 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Arg,.           
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 65 6e 63 2c 20 30 2c 0a 20 20        enc, 0,.  
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
c680: 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63 2c 20 30  Func[i].xFunc, 0
c690: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
c6a0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41  i=0; i<sizeof(aA
c6b0: 67 67 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 5b  gg)/sizeof(aAgg[
c6c0: 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  0]) && rc==SQLIT
c6d0: 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
c6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c6f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
c700: 20 61 41 67 67 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aAgg[i].zName, 
c710: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
c720: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 30 2c 20 61 41 67 67 5b 69 5d 2e 78      0, aAgg[i].x
c750: 53 74 65 70 2c 20 61 41 67 67 5b 69 5d 2e 78 46  Step, aAgg[i].xF
c760: 69 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  inal);.  }.  if(
c770: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c780: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c790: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
c7a0: 5f 76 32 28 64 62 2c 20 22 67 65 6f 70 6f 6c 79  _v2(db, "geopoly
c7b0: 22 2c 20 26 67 65 6f 70 6f 6c 79 4d 6f 64 75 6c  ", &geopolyModul
c7c0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
c7d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.