/ Hex Artifact Content
Login

Artifact d56ff997f2646b03be742eb85e8206f779d777f3a282fe0da576780ca0e11f20:


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 43 6f 6d 70 75 74  .}../*.** Comput
35c0: 65 20 74 68 65 20 61 72 65 61 20 65 6e 63 6c 6f  e the area enclo
35d0: 73 65 64 20 62 79 20 74 68 65 20 70 6f 6c 79 67  sed by the polyg
35e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
35f0: 6f 75 74 69 6e 65 20 63 61 6e 20 61 6c 73 6f 20  outine can also 
3600: 62 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 63  be used to detec
3610: 74 20 70 6f 6c 79 67 6f 6e 73 20 74 68 61 74 20  t polygons that 
3620: 72 6f 74 61 74 65 20 69 6e 0a 2a 2a 20 74 68 65  rotate in.** the
3630: 20 77 72 6f 6e 67 20 64 69 72 65 63 74 69 6f 6e   wrong direction
3640: 2e 20 20 50 6f 6c 79 67 6f 6e 73 20 61 72 65 20  .  Polygons are 
3650: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 63 6f  suppose to be co
3660: 75 6e 74 65 72 2d 63 6c 6f 63 6b 77 69 73 65 20  unter-clockwise 
3670: 28 43 43 57 29 2e 0a 2a 2a 20 54 68 69 73 20 72  (CCW)..** This r
3680: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
3690: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
36a0: 66 6f 72 20 63 6c 6f 63 6b 77 69 73 65 20 28 43  for clockwise (C
36b0: 57 29 20 70 6f 6c 79 67 6f 6e 73 2e 0a 2a 2f 0a  W) polygons..*/.
36c0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 67 65  static double ge
36d0: 6f 70 6f 6c 79 41 72 65 61 28 47 65 6f 50 6f 6c  opolyArea(GeoPol
36e0: 79 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20  y *p){.  double 
36f0: 72 41 72 65 61 20 3d 20 30 2e 30 3b 0a 20 20 69  rArea = 0.0;.  i
3700: 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d  nt ii;.  for(ii=
3710: 30 3b 20 69 69 3c 70 2d 3e 6e 56 65 72 74 65 78  0; ii<p->nVertex
3720: 2d 31 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 72  -1; ii++){.    r
3730: 41 72 65 61 20 2b 3d 20 28 70 2d 3e 61 5b 69 69  Area += (p->a[ii
3740: 2a 32 5d 20 2d 20 70 2d 3e 61 5b 69 69 2a 32 2b  *2] - p->a[ii*2+
3750: 32 5d 29 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2])           /*
3760: 20 28 78 30 20 2d 20 78 31 29 20 2a 2f 0a 20 20   (x0 - x1) */.  
3770: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 28 70              * (p
3780: 2d 3e 61 5b 69 69 2a 32 2b 31 5d 20 2b 20 70 2d  ->a[ii*2+1] + p-
3790: 3e 61 5b 69 69 2a 32 2b 33 5d 29 20 20 20 20 20  >a[ii*2+3])     
37a0: 20 2f 2a 20 28 79 30 20 2b 20 79 31 29 20 2a 2f   /* (y0 + y1) */
37b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
37c0: 20 30 2e 35 3b 0a 20 20 7d 0a 20 20 72 41 72 65   0.5;.  }.  rAre
37d0: 61 20 2b 3d 20 28 70 2d 3e 61 5b 69 69 2a 32 5d  a += (p->a[ii*2]
37e0: 20 2d 20 70 2d 3e 61 5b 30 5d 29 20 20 20 20 20   - p->a[0])     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 28 78 4e 20 2d 20 78 30 29 20 2a 2f 0a 20 20 20  (xN - x0) */.   
3810: 20 20 20 20 20 20 20 20 2a 20 28 70 2d 3e 61 5b          * (p->a[
3820: 69 69 2a 32 2b 31 5d 20 2b 20 70 2d 3e 61 5b 31  ii*2+1] + p->a[1
3830: 5d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ])              
3840: 2f 2a 20 28 79 4e 20 2b 20 79 30 29 20 2a 2f 0a  /* (yN + y0) */.
3850: 20 20 20 20 20 20 20 20 20 20 20 2a 20 30 2e 35             * 0.5
3860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 41 72 65 61  ;.  return rArea
3870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
3880: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3890: 20 67 65 6f 70 6f 6c 79 5f 61 72 65 61 28 58 29   geopoly_area(X)
38a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
38b0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
38c0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 47   a well-formed G
38d0: 65 6f 70 6f 6c 79 20 42 4c 4f 42 20 74 68 65 6e  eopoly BLOB then
38e0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 72 65 61   return the area
38f0: 0a 2a 2a 20 65 6e 63 6c 6f 73 65 64 20 62 79 20  .** enclosed by 
3900: 74 68 65 20 70 6f 6c 79 67 6f 6e 2e 20 20 49 66  the polygon.  If
3910: 20 74 68 65 20 70 6f 6c 79 67 6f 6e 20 63 69 72   the polygon cir
3920: 63 75 6c 61 74 65 73 20 63 6c 6f 63 6b 77 69 73  culates clockwis
3930: 65 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  e instead.** of 
3940: 63 6f 75 6e 74 65 72 63 6c 6f 63 6b 77 69 73 65  counterclockwise
3950: 20 28 61 73 20 69 74 20 73 68 6f 75 6c 64 29 20   (as it should) 
3960: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
3970: 6e 65 67 61 74 69 76 65 20 6f 66 20 74 68 65 0a  negative of the.
3980: 2a 2a 20 65 6e 63 6c 6f 73 65 64 20 61 72 65 61  ** enclosed area
3990: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
39a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
39b0: 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79  tic void geopoly
39c0: 41 72 65 61 46 75 6e 63 28 0a 20 20 73 71 6c 69  AreaFunc(.  sqli
39d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
39e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
39f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3a00: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 47 65  e **argv.){.  Ge
3a10: 6f 50 6f 6c 79 20 2a 70 20 3d 20 67 65 6f 70 6f  oPoly *p = geopo
3a20: 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e 74  lyFuncParam(cont
3a30: 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29  ext, argv[0], 0)
3a40: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
3a50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3a60: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
3a70: 67 65 6f 70 6f 6c 79 41 72 65 61 28 70 29 29 3b  geopolyArea(p));
3a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3a90: 65 28 70 29 3b 0a 20 20 7d 20 20 20 20 20 20 20  e(p);.  }       
3aa0: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49       .}../*.** I
3ab0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3ac0: 20 74 68 65 20 67 65 6f 70 6f 6c 79 5f 63 63 77   the geopoly_ccw
3ad0: 28 58 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  (X) function..**
3ae0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 6f 74 61 74  .** If the rotat
3af0: 69 6f 6e 20 6f 66 20 70 6f 6c 79 67 6f 6e 20 58  ion of polygon X
3b00: 20 69 73 20 63 6c 6f 63 6b 77 69 73 65 20 28 69   is clockwise (i
3b10: 6e 63 6f 72 72 65 63 74 29 20 69 6e 73 74 65 61  ncorrect) instea
3b20: 64 20 6f 66 0a 2a 2a 20 63 6f 75 6e 74 65 72 2d  d of.** counter-
3b30: 63 6c 6f 63 6b 77 69 73 65 20 28 74 68 65 20 63  clockwise (the c
3b40: 6f 72 72 65 63 74 20 77 69 6e 64 69 6e 67 20 6f  orrect winding o
3b50: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
3b60: 6f 20 52 46 43 37 39 34 36 29 0a 2a 2a 20 74 68  o RFC7946).** th
3b70: 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  en reverse the o
3b80: 72 64 65 72 20 6f 66 20 74 68 65 20 76 65 72 74  rder of the vert
3b90: 65 78 65 73 20 69 6e 20 70 6f 6c 79 67 6f 6e 20  exes in polygon 
3ba0: 58 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  X.  .**.** In ot
3bb0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 20  her words, this 
3bc0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3bd0: 61 20 43 43 57 20 70 6f 6c 79 67 6f 6e 20 72 65  a CCW polygon re
3be0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 0a  gardless of the.
3bf0: 2a 2a 20 77 69 6e 64 69 6e 67 20 6f 72 64 65 72  ** winding order
3c00: 20 6f 66 20 69 74 73 20 69 6e 70 75 74 2e 0a 2a   of its input..*
3c10: 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
3c20: 75 74 69 6e 65 20 74 6f 20 73 61 6e 69 74 69 7a  utine to sanitiz
3c30: 65 20 68 69 73 74 6f 72 69 63 61 6c 20 69 6e 70  e historical inp
3c40: 75 74 73 20 74 68 61 74 20 74 68 61 74 20 73 6f  uts that that so
3c50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 6f 6e 74 61  metimes.** conta
3c60: 69 6e 20 70 6f 6c 79 67 6f 6e 73 20 74 68 61 74  in polygons that
3c70: 20 77 69 6e 64 20 69 6e 20 74 68 65 20 77 72 6f   wind in the wro
3c80: 6e 67 20 64 69 72 65 63 74 69 6f 6e 2e 0a 2a 2f  ng direction..*/
3c90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
3ca0: 70 6f 6c 79 43 63 77 46 75 6e 63 28 0a 20 20 73  polyCcwFunc(.  s
3cb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3cc0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
3cd0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
3ce0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
3cf0: 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67 65   GeoPoly *p = ge
3d00: 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63  opolyFuncParam(c
3d10: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 2c  ontext, argv[0],
3d20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
3d30: 20 20 20 20 69 66 28 20 67 65 6f 70 6f 6c 79 41      if( geopolyA
3d40: 72 65 61 28 70 29 3c 30 2e 30 20 29 7b 0a 20 20  rea(p)<0.0 ){.  
3d50: 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a      int ii, jj;.
3d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 2c 20        for(ii=2, 
3d70: 6a 6a 3d 70 2d 3e 6e 56 65 72 74 65 78 2a 32 20  jj=p->nVertex*2 
3d80: 2d 20 32 3b 20 69 69 3c 6a 6a 3b 20 69 69 2b 3d  - 2; ii<jj; ii+=
3d90: 32 2c 20 6a 6a 2d 3d 32 29 7b 0a 20 20 20 20 20  2, jj-=2){.     
3da0: 20 20 20 47 65 6f 43 6f 6f 72 64 20 74 20 3d 20     GeoCoord t = 
3db0: 70 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  p->a[ii];.      
3dc0: 20 20 70 2d 3e 61 5b 69 69 5d 20 3d 20 70 2d 3e    p->a[ii] = p->
3dd0: 61 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  a[jj];.        p
3de0: 2d 3e 61 5b 6a 6a 5d 20 3d 20 74 3b 0a 20 20 20  ->a[jj] = t;.   
3df0: 20 20 20 20 20 74 20 3d 20 70 2d 3e 61 5b 69 69       t = p->a[ii
3e00: 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  +1];.        p->
3e10: 61 5b 69 69 2b 31 5d 20 3d 20 70 2d 3e 61 5b 6a  a[ii+1] = p->a[j
3e20: 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d  j+1];.        p-
3e30: 3e 61 5b 6a 6a 2b 31 5d 20 3d 20 74 3b 0a 20 20  >a[jj+1] = t;.  
3e40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3e50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
3e60: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  lob(context, p->
3e70: 68 64 72 2c 20 0a 20 20 20 20 20 20 20 34 2b 38  hdr, .       4+8
3e80: 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53 51 4c  *p->nVertex, SQL
3e90: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3eb0: 28 70 29 3b 0a 20 20 7d 20 20 20 20 20 20 20 20  (p);.  }        
3ec0: 20 20 20 20 0a 7d 0a 0a 23 64 65 66 69 6e 65 20      .}..#define 
3ed0: 47 45 4f 50 4f 4c 59 5f 50 49 20 33 2e 31 34 31  GEOPOLY_PI 3.141
3ee0: 35 39 32 36 35 33 35 38 39 37 39 33 32 33 38 35  5926535897932385
3ef0: 0a 0a 2f 2a 20 46 61 73 74 20 61 70 70 72 6f 78  ../* Fast approx
3f00: 69 6d 61 74 69 6f 6e 20 66 6f 72 20 73 69 6e 65  imation for sine
3f10: 28 58 29 20 66 6f 72 20 58 20 62 65 74 77 65 65  (X) for X betwee
3f20: 6e 20 2d 30 2e 35 2a 70 69 20 61 6e 64 20 32 2a  n -0.5*pi and 2*
3f30: 70 69 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  pi.*/.static dou
3f40: 62 6c 65 20 67 65 6f 70 6f 6c 79 53 69 6e 65 28  ble geopolySine(
3f50: 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 61 73 73  double r){.  ass
3f60: 65 72 74 28 20 72 3e 3d 2d 30 2e 35 2a 47 45 4f  ert( r>=-0.5*GEO
3f70: 50 4f 4c 59 5f 50 49 20 26 26 20 72 3c 3d 32 2e  POLY_PI && r<=2.
3f80: 30 2a 47 45 4f 50 4f 4c 59 5f 50 49 20 29 3b 0a  0*GEOPOLY_PI );.
3f90: 20 20 69 66 28 20 72 3e 3d 31 2e 35 2a 47 45 4f    if( r>=1.5*GEO
3fa0: 50 4f 4c 59 5f 50 49 20 29 7b 0a 20 20 20 20 72  POLY_PI ){.    r
3fb0: 20 2d 3d 20 32 2e 30 2a 47 45 4f 50 4f 4c 59 5f   -= 2.0*GEOPOLY_
3fc0: 50 49 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 3e  PI;.  }.  if( r>
3fd0: 3d 30 2e 35 2a 47 45 4f 50 4f 4c 59 5f 50 49 20  =0.5*GEOPOLY_PI 
3fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 67  ){.    return -g
3ff0: 65 6f 70 6f 6c 79 53 69 6e 65 28 72 2d 47 45 4f  eopolySine(r-GEO
4000: 50 4f 4c 59 5f 50 49 29 3b 0a 20 20 7d 65 6c 73  POLY_PI);.  }els
4010: 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 32  e{.    double r2
4020: 20 3d 20 72 2a 72 3b 0a 20 20 20 20 64 6f 75 62   = r*r;.    doub
4030: 6c 65 20 72 33 20 3d 20 72 32 2a 72 3b 0a 20 20  le r3 = r2*r;.  
4040: 20 20 64 6f 75 62 6c 65 20 72 35 20 3d 20 72 33    double r5 = r3
4050: 2a 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  *r2;.    return 
4060: 30 2e 39 39 39 36 39 34 39 2a 72 20 2d 20 30 2e  0.9996949*r - 0.
4070: 31 36 35 36 37 30 30 2a 72 33 20 2b 20 30 2e 30  1656700*r3 + 0.0
4080: 30 37 35 31 33 34 2a 72 35 3b 0a 20 20 7d 0a 7d  075134*r5;.  }.}
4090: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
40a0: 3a 20 20 20 67 65 6f 70 6f 6c 79 5f 72 65 67 75  :   geopoly_regu
40b0: 6c 61 72 28 58 2c 59 2c 52 2c 4e 29 0a 2a 2a 0a  lar(X,Y,R,N).**.
40c0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 73  ** Construct a s
40d0: 69 6d 70 6c 65 2c 20 63 6f 6e 76 65 78 2c 20 72  imple, convex, r
40e0: 65 67 75 6c 61 72 20 70 6f 6c 79 67 6f 6e 20 63  egular polygon c
40f0: 65 6e 74 65 72 65 64 20 61 74 20 58 2c 20 59 0a  entered at X, Y.
4100: 2a 2a 20 77 69 74 68 20 63 69 72 63 75 6d 72 61  ** with circumra
4110: 64 69 75 73 20 52 20 61 6e 64 20 77 69 74 68 20  dius R and with 
4120: 4e 20 73 69 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  N sides..*/.stat
4130: 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 52  ic void geopolyR
4140: 65 67 75 6c 61 72 46 75 6e 63 28 0a 20 20 73 71  egularFunc(.  sq
4150: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4160: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
4170: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
4180: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4190: 64 6f 75 62 6c 65 20 78 20 3d 20 73 71 6c 69 74  double x = sqlit
41a0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
41b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 64 6f 75 62  argv[0]);.  doub
41c0: 6c 65 20 79 20 3d 20 73 71 6c 69 74 65 33 5f 76  le y = sqlite3_v
41d0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
41e0: 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20 72  [1]);.  double r
41f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4200: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 32 5d 29  _double(argv[2])
4210: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69  ;.  int n = sqli
4220: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
4230: 67 76 5b 33 5d 29 3b 0a 20 20 69 6e 74 20 69 3b  gv[3]);.  int i;
4240: 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 3b 0a 0a  .  GeoPoly *p;..
4250: 20 20 69 66 28 20 6e 3c 33 20 7c 7c 20 72 3c 3d    if( n<3 || r<=
4260: 30 2e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  0.0 ) return;.  
4270: 69 66 28 20 6e 3e 31 30 30 30 20 29 20 6e 20 3d  if( n>1000 ) n =
4280: 20 31 30 30 30 3b 0a 20 20 70 20 3d 20 73 71 6c   1000;.  p = sql
4290: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
42a0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 6e 2d 31  izeof(*p) + (n-1
42b0: 29 2a 32 2a 73 69 7a 65 6f 66 28 47 65 6f 43 6f  )*2*sizeof(GeoCo
42c0: 6f 72 64 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  ord) );.  if( p=
42d0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
42e0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
42f0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
4300: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4310: 20 69 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 64 72   i = 1;.  p->hdr
4320: 5b 30 5d 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64  [0] = *(unsigned
4330: 20 63 68 61 72 2a 29 26 69 3b 0a 20 20 70 2d 3e   char*)&i;.  p->
4340: 68 64 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 70 2d  hdr[1] = 0;.  p-
4350: 3e 68 64 72 5b 32 5d 20 3d 20 28 6e 3e 3e 38 29  >hdr[2] = (n>>8)
4360: 26 30 78 66 66 3b 0a 20 20 70 2d 3e 68 64 72 5b  &0xff;.  p->hdr[
4370: 33 5d 20 3d 20 6e 26 30 78 66 66 3b 0a 20 20 66  3] = n&0xff;.  f
4380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
4390: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 41  ){.    double rA
43a0: 6e 67 6c 65 20 3d 20 32 2e 30 2a 47 45 4f 50 4f  ngle = 2.0*GEOPO
43b0: 4c 59 5f 50 49 2a 69 2f 6e 3b 0a 20 20 20 20 70  LY_PI*i/n;.    p
43c0: 2d 3e 61 5b 69 2a 32 5d 20 3d 20 78 20 2d 20 72  ->a[i*2] = x - r
43d0: 2a 67 65 6f 70 6f 6c 79 53 69 6e 65 28 72 41 6e  *geopolySine(rAn
43e0: 67 6c 65 2d 30 2e 35 2a 47 45 4f 50 4f 4c 59 5f  gle-0.5*GEOPOLY_
43f0: 50 49 29 3b 0a 20 20 20 20 70 2d 3e 61 5b 69 2a  PI);.    p->a[i*
4400: 32 2b 31 5d 20 3d 20 79 20 2b 20 72 2a 67 65 6f  2+1] = y + r*geo
4410: 70 6f 6c 79 53 69 6e 65 28 72 41 6e 67 6c 65 29  polySine(rAngle)
4420: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4430: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74  result_blob(cont
4440: 65 78 74 2c 20 70 2d 3e 68 64 72 2c 20 34 2b 38  ext, p->hdr, 4+8
4450: 2a 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  *n, SQLITE_TRANS
4460: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
4470: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
4480: 2a 2a 20 49 66 20 70 50 6f 6c 79 20 69 73 20 61  ** If pPoly is a
4490: 20 70 6f 6c 79 67 6f 6e 2c 20 63 6f 6d 70 75 74   polygon, comput
44a0: 65 20 69 74 73 20 62 6f 75 6e 64 69 6e 67 20 62  e its bounding b
44b0: 6f 78 2e 20 54 68 65 6e 3a 0a 2a 2a 0a 2a 2a 20  ox. Then:.**.** 
44c0: 20 20 20 28 31 29 20 69 66 20 61 43 6f 6f 72 64     (1) if aCoord
44d0: 21 3d 30 20 73 74 6f 72 65 20 74 68 65 20 62 6f  !=0 store the bo
44e0: 75 6e 64 69 6e 67 20 62 6f 78 20 69 6e 20 61 43  unding box in aC
44f0: 6f 6f 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  oord, returning 
4500: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 28 32 29 20 6f  NULL.**    (2) o
4510: 74 68 65 72 77 69 73 65 2c 20 63 6f 6d 70 75 74  therwise, comput
4520: 65 20 61 20 47 65 6f 50 6f 6c 79 20 66 6f 72 20  e a GeoPoly for 
4530: 74 68 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78  the bounding box
4540: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
4550: 2a 2a 20 20 20 20 20 20 20 20 6e 65 77 20 47 65  **        new Ge
4560: 6f 50 6f 6c 79 0a 2a 2a 0a 2a 2a 20 49 66 20 70  oPoly.**.** If p
4570: 50 6f 6c 79 20 69 73 20 4e 55 4c 4c 20 62 75 74  Poly is NULL but
4580: 20 61 43 6f 6f 72 64 20 69 73 20 6e 6f 74 20 4e   aCoord is not N
4590: 55 4c 4c 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  ULL, then comput
45a0: 65 20 61 20 6e 65 77 20 47 65 6f 50 6f 6c 79 20  e a new GeoPoly 
45b0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 6f 75 6e  from.** the boun
45c0: 64 69 6e 67 20 62 6f 78 20 69 6e 20 61 43 6f 6f  ding box in aCoo
45d0: 72 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  rd and return a 
45e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
45f0: 47 65 6f 50 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74  GeoPoly..*/.stat
4600: 69 63 20 47 65 6f 50 6f 6c 79 20 2a 67 65 6f 70  ic GeoPoly *geop
4610: 6f 6c 79 42 42 6f 78 28 0a 20 20 73 71 6c 69 74  olyBBox(.  sqlit
4620: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4630: 65 78 74 2c 20 20 20 2f 2a 20 46 6f 72 20 72 65  ext,   /* For re
4640: 63 6f 72 64 69 6e 67 20 74 68 65 20 65 72 72 6f  cording the erro
4650: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
4660: 61 6c 75 65 20 2a 70 50 6f 6c 79 2c 20 20 20 20  alue *pPoly,    
4670: 20 20 20 2f 2a 20 54 68 65 20 70 6f 6c 79 67 6f     /* The polygo
4680: 6e 20 2a 2f 0a 20 20 52 74 72 65 65 43 6f 6f 72  n */.  RtreeCoor
4690: 64 20 2a 61 43 6f 6f 72 64 2c 20 20 20 20 20 20  d *aCoord,      
46a0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 68 65     /* Results he
46b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  re */.  int *pRc
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
46e0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 47  e here */.){.  G
46f0: 65 6f 50 6f 6c 79 20 2a 70 4f 75 74 20 3d 20 30  eoPoly *pOut = 0
4700: 3b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 3b 0a  ;.  GeoPoly *p;.
4710: 20 20 66 6c 6f 61 74 20 6d 6e 58 2c 20 6d 78 58    float mnX, mxX
4720: 2c 20 6d 6e 59 2c 20 6d 78 59 3b 0a 20 20 69 66  , mnY, mxY;.  if
4730: 28 20 70 50 6f 6c 79 3d 3d 30 20 26 26 20 61 43  ( pPoly==0 && aC
4740: 6f 6f 72 64 21 3d 30 20 29 7b 0a 20 20 20 20 70  oord!=0 ){.    p
4750: 20 3d 20 30 3b 0a 20 20 20 20 6d 6e 58 20 3d 20   = 0;.    mnX = 
4760: 61 43 6f 6f 72 64 5b 30 5d 2e 66 3b 0a 20 20 20  aCoord[0].f;.   
4770: 20 6d 78 58 20 3d 20 61 43 6f 6f 72 64 5b 31 5d   mxX = aCoord[1]
4780: 2e 66 3b 0a 20 20 20 20 6d 6e 59 20 3d 20 61 43  .f;.    mnY = aC
4790: 6f 6f 72 64 5b 32 5d 2e 66 3b 0a 20 20 20 20 6d  oord[2].f;.    m
47a0: 78 59 20 3d 20 61 43 6f 6f 72 64 5b 33 5d 2e 66  xY = aCoord[3].f
47b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f  ;.    goto geopo
47c0: 6c 79 42 62 6f 78 46 69 6c 6c 3b 0a 20 20 7d 65  lyBboxFill;.  }e
47d0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 67 65 6f  lse{.    p = geo
47e0: 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f  polyFuncParam(co
47f0: 6e 74 65 78 74 2c 20 70 50 6f 6c 79 2c 20 70 52  ntext, pPoly, pR
4800: 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  c);.  }.  if( p 
4810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
4820: 20 20 20 6d 6e 58 20 3d 20 6d 78 58 20 3d 20 70     mnX = mxX = p
4830: 2d 3e 61 5b 30 5d 3b 0a 20 20 20 20 6d 6e 59 20  ->a[0];.    mnY 
4840: 3d 20 6d 78 59 20 3d 20 70 2d 3e 61 5b 31 5d 3b  = mxY = p->a[1];
4850: 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
4860: 69 3c 70 2d 3e 6e 56 65 72 74 65 78 3b 20 69 69  i<p->nVertex; ii
4870: 2b 2b 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  ++){.      doubl
4880: 65 20 72 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 5d  e r = p->a[ii*2]
4890: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 3c 6d 6e  ;.      if( r<mn
48a0: 58 20 29 20 6d 6e 58 20 3d 20 28 66 6c 6f 61 74  X ) mnX = (float
48b0: 29 72 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 69  )r;.      else i
48c0: 66 28 20 72 3e 6d 78 58 20 29 20 6d 78 58 20 3d  f( r>mxX ) mxX =
48d0: 20 28 66 6c 6f 61 74 29 72 3b 0a 20 20 20 20 20   (float)r;.     
48e0: 20 72 20 3d 20 70 2d 3e 61 5b 69 69 2a 32 2b 31   r = p->a[ii*2+1
48f0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 3c 6d  ];.      if( r<m
4900: 6e 59 20 29 20 6d 6e 59 20 3d 20 28 66 6c 6f 61  nY ) mnY = (floa
4910: 74 29 72 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  t)r;.      else 
4920: 69 66 28 20 72 3e 6d 78 59 20 29 20 6d 78 59 20  if( r>mxY ) mxY 
4930: 3d 20 28 66 6c 6f 61 74 29 72 3b 0a 20 20 20 20  = (float)r;.    
4940: 7d 0a 20 20 20 20 69 66 28 20 70 52 63 20 29 20  }.    if( pRc ) 
4950: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  *pRc = SQLITE_OK
4960: 3b 0a 20 20 20 20 69 66 28 20 61 43 6f 6f 72 64  ;.    if( aCoord
4970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 65 6f  ==0 ){.      geo
4980: 70 6f 6c 79 42 62 6f 78 46 69 6c 6c 3a 0a 20 20  polyBboxFill:.  
4990: 20 20 20 20 70 4f 75 74 20 3d 20 73 71 6c 69 74      pOut = sqlit
49a0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 47 45  e3_realloc(p, GE
49b0: 4f 50 4f 4c 59 5f 53 5a 28 34 29 29 3b 0a 20 20  OPOLY_SZ(4));.  
49c0: 20 20 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20      if( pOut==0 
49d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
49e0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
49f0: 20 20 20 20 69 66 28 20 63 6f 6e 74 65 78 74 20      if( context 
4a00: 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ) sqlite3_result
4a10: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
4a20: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 69  text);.        i
4a30: 66 28 20 70 52 63 20 29 20 2a 70 52 63 20 3d 20  f( pRc ) *pRc = 
4a40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
4a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
4a70: 75 74 2d 3e 6e 56 65 72 74 65 78 20 3d 20 34 3b  ut->nVertex = 4;
4a80: 0a 20 20 20 20 20 20 69 69 20 3d 20 31 3b 0a 20  .      ii = 1;. 
4a90: 20 20 20 20 20 70 4f 75 74 2d 3e 68 64 72 5b 30       pOut->hdr[0
4aa0: 5d 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63  ] = *(unsigned c
4ab0: 68 61 72 2a 29 26 69 69 3b 0a 20 20 20 20 20 20  har*)&ii;.      
4ac0: 70 4f 75 74 2d 3e 68 64 72 5b 31 5d 20 3d 20 30  pOut->hdr[1] = 0
4ad0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 68 64  ;.      pOut->hd
4ae0: 72 5b 32 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[2] = 0;.      
4af0: 70 4f 75 74 2d 3e 68 64 72 5b 33 5d 20 3d 20 34  pOut->hdr[3] = 4
4b00: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
4b10: 30 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20  0] = mnX;.      
4b20: 70 4f 75 74 2d 3e 61 5b 31 5d 20 3d 20 6d 6e 59  pOut->a[1] = mnY
4b30: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
4b40: 32 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20  2] = mxX;.      
4b50: 70 4f 75 74 2d 3e 61 5b 33 5d 20 3d 20 6d 6e 59  pOut->a[3] = mnY
4b60: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
4b70: 34 5d 20 3d 20 6d 78 58 3b 0a 20 20 20 20 20 20  4] = mxX;.      
4b80: 70 4f 75 74 2d 3e 61 5b 35 5d 20 3d 20 6d 78 59  pOut->a[5] = mxY
4b90: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 61 5b  ;.      pOut->a[
4ba0: 36 5d 20 3d 20 6d 6e 58 3b 0a 20 20 20 20 20 20  6] = mnX;.      
4bb0: 70 4f 75 74 2d 3e 61 5b 37 5d 20 3d 20 6d 78 59  pOut->a[7] = mxY
4bc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4bd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4be0: 70 29 3b 0a 20 20 20 20 20 20 61 43 6f 6f 72 64  p);.      aCoord
4bf0: 5b 30 5d 2e 66 20 3d 20 6d 6e 58 3b 0a 20 20 20  [0].f = mnX;.   
4c00: 20 20 20 61 43 6f 6f 72 64 5b 31 5d 2e 66 20 3d     aCoord[1].f =
4c10: 20 6d 78 58 3b 0a 20 20 20 20 20 20 61 43 6f 6f   mxX;.      aCoo
4c20: 72 64 5b 32 5d 2e 66 20 3d 20 6d 6e 59 3b 0a 20  rd[2].f = mnY;. 
4c30: 20 20 20 20 20 61 43 6f 6f 72 64 5b 33 5d 2e 66       aCoord[3].f
4c40: 20 3d 20 6d 78 59 3b 0a 20 20 20 20 7d 0a 20 20   = mxY;.    }.  
4c50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b  }.  return pOut;
4c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4c70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4c80: 67 65 6f 70 6f 6c 79 5f 62 62 6f 78 28 58 29 20  geopoly_bbox(X) 
4c90: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  SQL function..*/
4ca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f  .static void geo
4cb0: 70 6f 6c 79 42 42 6f 78 46 75 6e 63 28 0a 20 20  polyBBoxFunc(.  
4cc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4cd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4ce0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
4cf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4d00: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 20 3d 20 67    GeoPoly *p = g
4d10: 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e 74 65  eopolyBBox(conte
4d20: 78 74 2c 20 61 72 67 76 5b 30 5d 2c 20 30 2c 20  xt, argv[0], 0, 
4d30: 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  0);.  if( p ){. 
4d40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4d50: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
4d60: 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20 20 20  p->hdr, .       
4d70: 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20  4+8*p->nVertex, 
4d80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
4d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4da0: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
4db0: 2a 0a 2a 2a 20 53 74 61 74 65 20 76 65 63 74 6f  *.** State vecto
4dc0: 72 20 66 6f 72 20 74 68 65 20 67 65 6f 70 6f 6c  r for the geopol
4dd0: 79 5f 67 72 6f 75 70 5f 62 62 6f 78 28 29 20 61  y_group_bbox() a
4de0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4df0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
4e00: 72 75 63 74 20 47 65 6f 42 42 6f 78 20 47 65 6f  ruct GeoBBox Geo
4e10: 42 42 6f 78 3b 0a 73 74 72 75 63 74 20 47 65 6f  BBox;.struct Geo
4e20: 42 42 6f 78 20 7b 0a 20 20 69 6e 74 20 69 73 49  BBox {.  int isI
4e30: 6e 69 74 3b 0a 20 20 52 74 72 65 65 43 6f 6f 72  nit;.  RtreeCoor
4e40: 64 20 61 5b 34 5d 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a  d a[4];.};.../*.
4e50: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4e60: 6e 20 6f 66 20 74 68 65 20 67 65 6f 70 6f 6c 79  n of the geopoly
4e70: 5f 67 72 6f 75 70 5f 62 62 6f 78 28 58 29 20 61  _group_bbox(X) a
4e80: 67 67 72 65 67 61 74 65 20 53 51 4c 20 66 75 6e  ggregate SQL fun
4e90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4ea0: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f   void geopolyBBo
4eb0: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
4ec0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4ed0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
4ee0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4ef0: 2a 61 72 67 76 0a 29 7b 0a 20 20 52 74 72 65 65  *argv.){.  Rtree
4f00: 43 6f 6f 72 64 20 61 5b 34 5d 3b 0a 20 20 69 6e  Coord a[4];.  in
4f10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4f20: 3b 0a 20 20 28 76 6f 69 64 29 67 65 6f 70 6f 6c  ;.  (void)geopol
4f30: 79 42 42 6f 78 28 63 6f 6e 74 65 78 74 2c 20 61  yBBox(context, a
4f40: 72 67 76 5b 30 5d 2c 20 61 2c 20 26 72 63 29 3b  rgv[0], a, &rc);
4f50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4f60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 47 65 6f 42  E_OK ){.    GeoB
4f70: 42 6f 78 20 2a 70 42 42 6f 78 3b 0a 20 20 20 20  Box *pBBox;.    
4f80: 70 42 42 6f 78 20 3d 20 28 47 65 6f 42 42 6f 78  pBBox = (GeoBBox
4f90: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
4fa0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
4fb0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 42  ext, sizeof(*pBB
4fc0: 6f 78 29 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ox));.    if( pB
4fd0: 42 6f 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Box==0 ) return;
4fe0: 0a 20 20 20 20 69 66 28 20 70 42 42 6f 78 2d 3e  .    if( pBBox->
4ff0: 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
5000: 20 20 20 70 42 42 6f 78 2d 3e 69 73 49 6e 69 74     pBBox->isInit
5010: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = 1;.      memc
5020: 70 79 28 70 42 42 6f 78 2d 3e 61 2c 20 61 2c 20  py(pBBox->a, a, 
5030: 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6f 72  sizeof(RtreeCoor
5040: 64 29 2a 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d)*4);.    }else
5050: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d  {.      if( a[0]
5060: 2e 66 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 30 5d  .f < pBBox->a[0]
5070: 2e 66 20 29 20 70 42 42 6f 78 2d 3e 61 5b 30 5d  .f ) pBBox->a[0]
5080: 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 69   = a[0];.      i
5090: 66 28 20 61 5b 31 5d 2e 66 20 3e 20 70 42 42 6f  f( a[1].f > pBBo
50a0: 78 2d 3e 61 5b 31 5d 2e 66 20 29 20 70 42 42 6f  x->a[1].f ) pBBo
50b0: 78 2d 3e 61 5b 31 5d 20 3d 20 61 5b 31 5d 3b 0a  x->a[1] = a[1];.
50c0: 20 20 20 20 20 20 69 66 28 20 61 5b 32 5d 2e 66        if( a[2].f
50d0: 20 3c 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 2e 66   < pBBox->a[2].f
50e0: 20 29 20 70 42 42 6f 78 2d 3e 61 5b 32 5d 20 3d   ) pBBox->a[2] =
50f0: 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28   a[2];.      if(
5100: 20 61 5b 33 5d 2e 66 20 3e 20 70 42 42 6f 78 2d   a[3].f > pBBox-
5110: 3e 61 5b 33 5d 2e 66 20 29 20 70 42 42 6f 78 2d  >a[3].f ) pBBox-
5120: 3e 61 5b 33 5d 20 3d 20 61 5b 33 5d 3b 0a 20 20  >a[3] = a[3];.  
5130: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5140: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 42 42 6f   void geopolyBBo
5150: 78 46 69 6e 61 6c 28 0a 20 20 73 71 6c 69 74 65  xFinal(.  sqlite
5160: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5170: 78 74 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20  xt.){.  GeoPoly 
5180: 2a 70 3b 0a 20 20 47 65 6f 42 42 6f 78 20 2a 70  *p;.  GeoBBox *p
5190: 42 42 6f 78 3b 0a 20 20 70 42 42 6f 78 20 3d 20  BBox;.  pBBox = 
51a0: 28 47 65 6f 42 42 6f 78 2a 29 73 71 6c 69 74 65  (GeoBBox*)sqlite
51b0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
51c0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
51d0: 0a 20 20 69 66 28 20 70 42 42 6f 78 3d 3d 30 20  .  if( pBBox==0 
51e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
51f0: 67 65 6f 70 6f 6c 79 42 42 6f 78 28 63 6f 6e 74  geopolyBBox(cont
5200: 65 78 74 2c 20 30 2c 20 70 42 42 6f 78 2d 3e 61  ext, 0, pBBox->a
5210: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
5220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5230: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
5240: 2c 20 70 2d 3e 68 64 72 2c 20 0a 20 20 20 20 20  , p->hdr, .     
5250: 20 20 34 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78    4+8*p->nVertex
5260: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5270: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
5280: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
5290: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
52a0: 65 20 69 66 20 70 6f 69 6e 74 20 28 78 30 2c 79  e if point (x0,y
52b0: 30 29 20 69 73 20 62 65 6e 65 61 74 68 20 6c 69  0) is beneath li
52c0: 6e 65 20 73 65 67 6d 65 6e 74 20 28 78 31 2c 79  ne segment (x1,y
52d0: 31 29 2d 3e 28 78 32 2c 79 32 29 2e 0a 2a 2a 20  1)->(x2,y2)..** 
52e0: 52 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  Returns:.**.**  
52f0: 20 20 2b 32 20 20 78 30 2c 79 30 20 69 73 20 6f    +2  x0,y0 is o
5300: 6e 20 74 68 65 20 6c 69 6e 65 20 73 65 67 65 6d  n the line segem
5310: 65 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 2b 31 20  ent.**.**    +1 
5320: 20 78 30 2c 79 30 20 69 73 20 62 65 6e 65 61 74   x0,y0 is beneat
5330: 68 20 6c 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a  h line segment.*
5340: 2a 0a 2a 2a 20 20 20 20 30 20 20 20 78 30 2c 79  *.**    0   x0,y
5350: 30 20 69 73 20 6e 6f 74 20 6f 6e 20 6f 72 20 62  0 is not on or b
5360: 65 6e 65 61 74 68 20 74 68 65 20 6c 69 6e 65 20  eneath the line 
5370: 73 65 67 6d 65 6e 74 20 6f 72 20 74 68 65 20 6c  segment or the l
5380: 69 6e 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 20  ine segment.**  
5390: 20 20 20 20 20 20 69 73 20 76 65 72 74 69 63 61        is vertica
53a0: 6c 20 61 6e 64 20 78 30 2c 79 30 20 69 73 20 6e  l and x0,y0 is n
53b0: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 6e 65 20 73  ot on the line s
53c0: 65 67 6d 65 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  egment.**.** The
53d0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6f 72 64   left-most coord
53e0: 69 6e 61 74 65 20 6d 69 6e 28 78 31 2c 78 32 29  inate min(x1,x2)
53f0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
5400: 65 64 20 74 6f 20 62 65 20 70 61 72 74 20 6f 66  ed to be part of
5410: 0a 2a 2a 20 74 68 65 20 6c 69 6e 65 20 73 65 67  .** the line seg
5420: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  ment for the pur
5430: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 61 6e  poses of this an
5440: 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
5450: 63 20 69 6e 74 20 70 6f 69 6e 74 42 65 6e 65 61  c int pointBenea
5460: 74 68 4c 69 6e 65 28 0a 20 20 64 6f 75 62 6c 65  thLine(.  double
5470: 20 78 30 2c 20 64 6f 75 62 6c 65 20 79 30 2c 0a   x0, double y0,.
5480: 20 20 64 6f 75 62 6c 65 20 78 31 2c 20 64 6f 75    double x1, dou
5490: 62 6c 65 20 79 31 2c 0a 20 20 64 6f 75 62 6c 65  ble y1,.  double
54a0: 20 78 32 2c 20 64 6f 75 62 6c 65 20 79 32 0a 29   x2, double y2.)
54b0: 7b 0a 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20  {.  double y;.  
54c0: 69 66 28 20 78 30 3d 3d 78 31 20 26 26 20 79 30  if( x0==x1 && y0
54d0: 3d 3d 79 31 20 29 20 72 65 74 75 72 6e 20 32 3b  ==y1 ) return 2;
54e0: 0a 20 20 69 66 28 20 78 31 3c 78 32 20 29 7b 0a  .  if( x1<x2 ){.
54f0: 20 20 20 20 69 66 28 20 78 30 3c 3d 78 31 20 7c      if( x0<=x1 |
5500: 7c 20 78 30 3e 78 32 20 29 20 72 65 74 75 72 6e  | x0>x2 ) return
5510: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
5520: 78 31 3e 78 32 20 29 7b 0a 20 20 20 20 69 66 28  x1>x2 ){.    if(
5530: 20 78 30 3c 3d 78 32 20 7c 7c 20 78 30 3e 78 31   x0<=x2 || x0>x1
5540: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
5550: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 56 65 72  else{.    /* Ver
5560: 74 69 63 61 6c 20 6c 69 6e 65 20 73 65 67 6d 65  tical line segme
5570: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 30  nt */.    if( x0
5580: 21 3d 78 31 20 29 20 72 65 74 75 72 6e 20 30 3b  !=x1 ) return 0;
5590: 0a 20 20 20 20 69 66 28 20 79 30 3c 79 31 20 26  .    if( y0<y1 &
55a0: 26 20 79 30 3c 79 32 20 29 20 72 65 74 75 72 6e  & y0<y2 ) return
55b0: 20 30 3b 0a 20 20 20 20 69 66 28 20 79 30 3e 79   0;.    if( y0>y
55c0: 31 20 26 26 20 79 30 3e 79 32 20 29 20 72 65 74  1 && y0>y2 ) ret
55d0: 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
55e0: 6e 20 32 3b 0a 20 20 7d 0a 20 20 79 20 3d 20 79  n 2;.  }.  y = y
55f0: 31 20 2b 20 28 79 32 2d 79 31 29 2a 28 78 30 2d  1 + (y2-y1)*(x0-
5600: 78 31 29 2f 28 78 32 2d 78 31 29 3b 0a 20 20 69  x1)/(x2-x1);.  i
5610: 66 28 20 79 30 3d 3d 79 20 29 20 72 65 74 75 72  f( y0==y ) retur
5620: 6e 20 32 3b 0a 20 20 69 66 28 20 79 30 3c 79 20  n 2;.  if( y0<y 
5630: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
5640: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5650: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
5660: 20 20 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61 69    geopoly_contai
5670: 6e 73 5f 70 6f 69 6e 74 28 50 2c 58 2c 59 29 0a  ns_point(P,X,Y).
5680: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 32 20  **.** Return +2 
5690: 69 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20  if point X,Y is 
56a0: 77 69 74 68 69 6e 20 70 6f 6c 79 67 6f 6e 20 50  within polygon P
56b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2b 31 20 69  ..** Return +1 i
56c0: 66 20 70 6f 69 6e 74 20 58 2c 59 20 69 73 20 6f  f point X,Y is o
56d0: 6e 20 74 68 65 20 70 6f 6c 79 67 6f 6e 20 62 6f  n the polygon bo
56e0: 75 6e 64 61 72 79 2e 0a 2a 2a 20 52 65 74 75 72  undary..** Retur
56f0: 6e 20 30 20 69 66 20 70 6f 69 6e 74 20 58 2c 59  n 0 if point X,Y
5700: 20 69 73 20 6f 75 74 73 69 64 65 20 74 68 65 20   is outside the 
5710: 70 6f 6c 79 67 6f 6e 0a 2a 2f 0a 73 74 61 74 69  polygon.*/.stati
5720: 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 43 6f  c void geopolyCo
5730: 6e 74 61 69 6e 73 50 6f 69 6e 74 46 75 6e 63 28  ntainsPointFunc(
5740: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5750: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5760: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5770: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5780: 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31  ){.  GeoPoly *p1
5790: 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61   = geopolyFuncPa
57a0: 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ram(context, arg
57b0: 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 64 6f 75 62  v[0], 0);.  doub
57c0: 6c 65 20 78 30 20 3d 20 73 71 6c 69 74 65 33 5f  le x0 = sqlite3_
57d0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
57e0: 76 5b 31 5d 29 3b 0a 20 20 64 6f 75 62 6c 65 20  v[1]);.  double 
57f0: 79 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  y0 = sqlite3_val
5800: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 32  ue_double(argv[2
5810: 5d 29 3b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  ]);.  int v = 0;
5820: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
5830: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 66 28 20    int ii;.  if( 
5840: 70 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  p1==0 ) return;.
5850: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
5860: 31 2d 3e 6e 56 65 72 74 65 78 2d 31 3b 20 69 69  1->nVertex-1; ii
5870: 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 70 6f 69  ++){.    v = poi
5880: 6e 74 42 65 6e 65 61 74 68 4c 69 6e 65 28 78 30  ntBeneathLine(x0
5890: 2c 79 30 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d 2c  ,y0,p1->a[ii*2],
58a0: 70 31 2d 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20  p1->a[ii*2+1],. 
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 31                p1
58d0: 2d 3e 61 5b 69 69 2a 32 2b 32 5d 2c 70 31 2d 3e  ->a[ii*2+2],p1->
58e0: 61 5b 69 69 2a 32 2b 33 5d 29 3b 0a 20 20 20 20  a[ii*2+3]);.    
58f0: 69 66 28 20 76 3d 3d 32 20 29 20 62 72 65 61 6b  if( v==2 ) break
5900: 3b 0a 20 20 20 20 63 6e 74 20 2b 3d 20 76 3b 0a  ;.    cnt += v;.
5910: 20 20 7d 0a 20 20 69 66 28 20 76 21 3d 32 20 29    }.  if( v!=2 )
5920: 7b 0a 20 20 20 20 76 20 3d 20 70 6f 69 6e 74 42  {.    v = pointB
5930: 65 6e 65 61 74 68 4c 69 6e 65 28 78 30 2c 79 30  eneathLine(x0,y0
5940: 2c 70 31 2d 3e 61 5b 69 69 2a 32 5d 2c 70 31 2d  ,p1->a[ii*2],p1-
5950: 3e 61 5b 69 69 2a 32 2b 31 5d 2c 0a 20 20 20 20  >a[ii*2+1],.    
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 20 20 20 20 20 20 70 31 2d 3e 61             p1->a
5980: 5b 30 5d 2c 70 31 2d 3e 61 5b 31 5d 29 3b 0a 20  [0],p1->a[1]);. 
5990: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 32 20 29 7b   }.  if( v==2 ){
59a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
59b0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
59c0: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   1);.  }else if(
59d0: 20 28 28 76 2b 63 6e 74 29 26 31 29 3d 3d 30 20   ((v+cnt)&1)==0 
59e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
59f0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
5a00: 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
5a10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5a20: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5a30: 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
5a40: 33 5f 66 72 65 65 28 70 31 29 3b 0a 7d 0a 0a 2f  3_free(p1);.}../
5a50: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
5a60: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
5a70: 69 6e 74 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c  int geopolyOverl
5a80: 61 70 28 47 65 6f 50 6f 6c 79 20 2a 70 31 2c 20  ap(GeoPoly *p1, 
5a90: 47 65 6f 50 6f 6c 79 20 2a 70 32 29 3b 0a 0a 2f  GeoPoly *p2);../
5aa0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
5ab0: 6e 3a 20 20 20 20 67 65 6f 70 6f 6c 79 5f 77 69  n:    geopoly_wi
5ac0: 74 68 69 6e 28 50 31 2c 50 32 29 0a 2a 2a 0a 2a  thin(P1,P2).**.*
5ad0: 2a 20 52 65 74 75 72 6e 20 2b 32 20 69 66 20 50  * Return +2 if P
5ae0: 31 20 61 6e 64 20 50 32 20 61 72 65 20 74 68 65  1 and P2 are the
5af0: 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e 0a 2a 2a   same polygon.**
5b00: 20 52 65 74 75 72 6e 20 2b 31 20 69 66 20 50 32   Return +1 if P2
5b10: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
5b20: 74 68 69 6e 20 50 31 0a 2a 2a 20 52 65 74 75 72  thin P1.** Retur
5b30: 6e 20 30 20 69 66 20 61 6e 79 20 70 61 72 74 20  n 0 if any part 
5b40: 6f 66 20 50 32 20 69 73 20 6f 6e 20 74 68 65 20  of P2 is on the 
5b50: 6f 75 74 73 69 64 65 20 6f 66 20 50 31 0a 2a 2a  outside of P1.**
5b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5b70: 67 65 6f 70 6f 6c 79 57 69 74 68 69 6e 46 75 6e  geopolyWithinFun
5b80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5b90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5ba0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5bb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5bc0: 76 0a 29 7b 0a 20 20 47 65 6f 50 6f 6c 79 20 2a  v.){.  GeoPoly *
5bd0: 70 31 20 3d 20 67 65 6f 70 6f 6c 79 46 75 6e 63  p1 = geopolyFunc
5be0: 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c 20 61  Param(context, a
5bf0: 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20 47 65  rgv[0], 0);.  Ge
5c00: 6f 50 6f 6c 79 20 2a 70 32 20 3d 20 67 65 6f 70  oPoly *p2 = geop
5c10: 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 63 6f 6e  olyFuncParam(con
5c20: 74 65 78 74 2c 20 61 72 67 76 5b 31 5d 2c 20 30  text, argv[1], 0
5c30: 29 3b 0a 20 20 69 66 28 20 70 31 20 26 26 20 70  );.  if( p1 && p
5c40: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  2 ){.    int x =
5c50: 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 28   geopolyOverlap(
5c60: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28  p1, p2);.    if(
5c70: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71   x<0 ){.      sq
5c80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5c90: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
5ca0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5cc0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5cd0: 78 3d 3d 32 20 3f 20 31 20 3a 20 78 3d 3d 34 20  x==2 ? 1 : x==4 
5ce0: 3f 20 32 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  ? 2 : 0);.    }.
5cf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5d00: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
5d10: 33 5f 66 72 65 65 28 70 32 29 3b 0a 7d 0a 0a 2f  3_free(p2);.}../
5d20: 2a 20 4f 62 6a 65 63 74 73 20 75 73 65 64 20 62  * Objects used b
5d30: 79 20 74 68 65 20 6f 76 65 72 6c 61 70 20 61 6c  y the overlap al
5d40: 67 6f 72 69 68 6d 2e 20 2a 2f 0a 74 79 70 65 64  gorihm. */.typed
5d50: 65 66 20 73 74 72 75 63 74 20 47 65 6f 45 76 65  ef struct GeoEve
5d60: 6e 74 20 47 65 6f 45 76 65 6e 74 3b 0a 74 79 70  nt GeoEvent;.typ
5d70: 65 64 65 66 20 73 74 72 75 63 74 20 47 65 6f 53  edef struct GeoS
5d80: 65 67 6d 65 6e 74 20 47 65 6f 53 65 67 6d 65 6e  egment GeoSegmen
5d90: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
5da0: 74 20 47 65 6f 4f 76 65 72 6c 61 70 20 47 65 6f  t GeoOverlap Geo
5db0: 4f 76 65 72 6c 61 70 3b 0a 73 74 72 75 63 74 20  Overlap;.struct 
5dc0: 47 65 6f 45 76 65 6e 74 20 7b 0a 20 20 64 6f 75  GeoEvent {.  dou
5dd0: 62 6c 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  ble x;          
5de0: 20 20 20 20 2f 2a 20 58 20 63 6f 6f 72 64 69 6e      /* X coordin
5df0: 61 74 65 20 61 74 20 77 68 69 63 68 20 65 76 65  ate at which eve
5e00: 6e 74 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  nt occurs */.  i
5e10: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
5e20: 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 41        /* 0 for A
5e30: 44 44 2c 20 31 20 66 6f 72 20 52 45 4d 4f 56 45  DD, 1 for REMOVE
5e40: 20 2a 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74   */.  GeoSegment
5e50: 20 2a 70 53 65 67 3b 20 20 20 20 20 20 2f 2a 20   *pSeg;      /* 
5e60: 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 62  The segment to b
5e70: 65 20 61 64 64 65 64 20 6f 72 20 72 65 6d 6f 76  e added or remov
5e80: 65 64 20 2a 2f 0a 20 20 47 65 6f 45 76 65 6e 74  ed */.  GeoEvent
5e90: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
5ea0: 2a 20 4e 65 78 74 20 65 76 65 6e 74 20 69 6e 20  * Next event in 
5eb0: 74 68 65 20 73 6f 72 74 65 64 20 6c 69 73 74 20  the sorted list 
5ec0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65 6f  */.};.struct Geo
5ed0: 53 65 67 6d 65 6e 74 20 7b 0a 20 20 64 6f 75 62  Segment {.  doub
5ee0: 6c 65 20 43 2c 20 42 3b 20 20 20 20 20 20 20 20  le C, B;        
5ef0: 20 20 20 2f 2a 20 79 20 3d 20 43 2a 78 20 2b 20     /* y = C*x + 
5f00: 42 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 79 3b  B */.  double y;
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f20: 20 43 75 72 72 65 6e 74 20 79 20 76 61 6c 75 65   Current y value
5f30: 20 2a 2f 0a 20 20 66 6c 6f 61 74 20 79 30 3b 20   */.  float y0; 
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f50: 49 6e 69 74 69 61 6c 20 79 20 76 61 6c 75 65 20  Initial y value 
5f60: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5f70: 61 72 20 73 69 64 65 3b 20 20 20 20 2f 2a 20 31  ar side;    /* 1
5f80: 20 66 6f 72 20 70 31 2c 20 32 20 66 6f 72 20 70   for p1, 2 for p
5f90: 32 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  2 */.  unsigned 
5fa0: 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 2f 2a  int idx;      /*
5fb0: 20 57 68 69 63 68 20 73 65 67 6d 65 6e 74 20 77   Which segment w
5fc0: 69 74 68 69 6e 20 74 68 65 20 73 69 64 65 20 2a  ithin the side *
5fd0: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
5fe0: 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  pNext;     /* Ne
5ff0: 78 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 20  xt segment in a 
6000: 6c 69 73 74 20 73 6f 72 74 65 64 20 62 79 20 79  list sorted by y
6010: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 47 65   */.};.struct Ge
6020: 6f 4f 76 65 72 6c 61 70 20 7b 0a 20 20 47 65 6f  oOverlap {.  Geo
6030: 45 76 65 6e 74 20 2a 61 45 76 65 6e 74 3b 20 20  Event *aEvent;  
6040: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6050: 20 6f 66 20 61 6c 6c 20 65 76 65 6e 74 73 20 2a   of all events *
6060: 2f 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  /.  GeoSegment *
6070: 61 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 2f  aSegment;      /
6080: 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 73  * Array of all s
6090: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  egments */.  int
60a0: 20 6e 45 76 65 6e 74 3b 20 20 20 20 20 20 20 20   nEvent;        
60b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
60c0: 72 20 6f 66 20 65 76 65 6e 74 73 20 2a 2f 0a 20  r of events */. 
60d0: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20   int nSegment;  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
60f0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
6100: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  s */.};../*.** A
6110: 64 64 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  dd a single segm
6120: 65 6e 74 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ent and its asso
6130: 63 69 61 74 65 64 20 65 76 65 6e 74 73 2e 0a 2a  ciated events..*
6140: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
6150: 6f 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65  opolyAddOneSegme
6160: 6e 74 28 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70  nt(.  GeoOverlap
6170: 20 2a 70 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20   *p,.  GeoCoord 
6180: 78 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79  x0,.  GeoCoord y
6190: 30 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 78 31  0,.  GeoCoord x1
61a0: 2c 0a 20 20 47 65 6f 43 6f 6f 72 64 20 79 31 2c  ,.  GeoCoord y1,
61b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
61c0: 20 73 69 64 65 2c 0a 20 20 75 6e 73 69 67 6e 65   side,.  unsigne
61d0: 64 20 69 6e 74 20 69 64 78 0a 29 7b 0a 20 20 47  d int idx.){.  G
61e0: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  eoSegment *pSeg;
61f0: 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 45 76  .  GeoEvent *pEv
6200: 65 6e 74 3b 0a 20 20 69 66 28 20 78 30 3d 3d 78  ent;.  if( x0==x
6210: 31 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  1 ) return;  /* 
6220: 49 67 6e 6f 72 65 20 76 65 72 74 69 63 61 6c 20  Ignore vertical 
6230: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66  segments */.  if
6240: 28 20 78 30 3e 78 31 20 29 7b 0a 20 20 20 20 47  ( x0>x1 ){.    G
6250: 65 6f 43 6f 6f 72 64 20 74 20 3d 20 78 30 3b 0a  eoCoord t = x0;.
6260: 20 20 20 20 78 30 20 3d 20 78 31 3b 0a 20 20 20      x0 = x1;.   
6270: 20 78 31 20 3d 20 74 3b 0a 20 20 20 20 74 20 3d   x1 = t;.    t =
6280: 20 79 30 3b 0a 20 20 20 20 79 30 20 3d 20 79 31   y0;.    y0 = y1
6290: 3b 0a 20 20 20 20 79 31 20 3d 20 74 3b 0a 20 20  ;.    y1 = t;.  
62a0: 7d 0a 20 20 70 53 65 67 20 3d 20 70 2d 3e 61 53  }.  pSeg = p->aS
62b0: 65 67 6d 65 6e 74 20 2b 20 70 2d 3e 6e 53 65 67  egment + p->nSeg
62c0: 6d 65 6e 74 3b 0a 20 20 70 2d 3e 6e 53 65 67 6d  ment;.  p->nSegm
62d0: 65 6e 74 2b 2b 3b 0a 20 20 70 53 65 67 2d 3e 43  ent++;.  pSeg->C
62e0: 20 3d 20 28 79 31 2d 79 30 29 2f 28 78 31 2d 78   = (y1-y0)/(x1-x
62f0: 30 29 3b 0a 20 20 70 53 65 67 2d 3e 42 20 3d 20  0);.  pSeg->B = 
6300: 79 31 20 2d 20 78 31 2a 70 53 65 67 2d 3e 43 3b  y1 - x1*pSeg->C;
6310: 0a 20 20 70 53 65 67 2d 3e 79 30 20 3d 20 79 30  .  pSeg->y0 = y0
6320: 3b 0a 20 20 70 53 65 67 2d 3e 73 69 64 65 20 3d  ;.  pSeg->side =
6330: 20 73 69 64 65 3b 0a 20 20 70 53 65 67 2d 3e 69   side;.  pSeg->i
6340: 64 78 20 3d 20 69 64 78 3b 0a 20 20 70 45 76 65  dx = idx;.  pEve
6350: 6e 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b  nt = p->aEvent +
6360: 20 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d   p->nEvent;.  p-
6370: 3e 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76  >nEvent++;.  pEv
6380: 65 6e 74 2d 3e 78 20 3d 20 78 30 3b 0a 20 20 70  ent->x = x0;.  p
6390: 45 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 30  Event->eType = 0
63a0: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67  ;.  pEvent->pSeg
63b0: 20 3d 20 70 53 65 67 3b 0a 20 20 70 45 76 65 6e   = pSeg;.  pEven
63c0: 74 20 3d 20 70 2d 3e 61 45 76 65 6e 74 20 2b 20  t = p->aEvent + 
63d0: 70 2d 3e 6e 45 76 65 6e 74 3b 0a 20 20 70 2d 3e  p->nEvent;.  p->
63e0: 6e 45 76 65 6e 74 2b 2b 3b 0a 20 20 70 45 76 65  nEvent++;.  pEve
63f0: 6e 74 2d 3e 78 20 3d 20 78 31 3b 0a 20 20 70 45  nt->x = x1;.  pE
6400: 76 65 6e 74 2d 3e 65 54 79 70 65 20 3d 20 31 3b  vent->eType = 1;
6410: 0a 20 20 70 45 76 65 6e 74 2d 3e 70 53 65 67 20  .  pEvent->pSeg 
6420: 3d 20 70 53 65 67 3b 0a 7d 0a 20 20 0a 0a 0a 2f  = pSeg;.}.  .../
6430: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 6c 6c 20  *.** Insert all 
6440: 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 65 76 65  segments and eve
6450: 6e 74 73 20 66 6f 72 20 70 6f 6c 79 67 6f 6e 20  nts for polygon 
6460: 70 50 6f 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPoly..*/.static
6470: 20 76 6f 69 64 20 67 65 6f 70 6f 6c 79 41 64 64   void geopolyAdd
6480: 53 65 67 6d 65 6e 74 73 28 0a 20 20 47 65 6f 4f  Segments(.  GeoO
6490: 76 65 72 6c 61 70 20 2a 70 2c 20 20 20 20 20 20  verlap *p,      
64a0: 20 20 20 20 2f 2a 20 41 64 64 20 73 65 67 6d 65      /* Add segme
64b0: 6e 74 73 20 74 6f 20 74 68 69 73 20 4f 76 65 72  nts to this Over
64c0: 6c 61 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  lap object */.  
64d0: 47 65 6f 50 6f 6c 79 20 2a 70 50 6f 6c 79 2c 20  GeoPoly *pPoly, 
64e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 65 20          /* Take 
64f0: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  all segments fro
6500: 6d 20 74 68 69 73 20 70 6f 6c 79 67 6f 6e 20 2a  m this polygon *
6510: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6520: 72 20 73 69 64 65 20 20 20 20 20 20 2f 2a 20 54  r side      /* T
6530: 68 65 20 73 69 64 65 20 6f 66 20 70 50 6f 6c 79  he side of pPoly
6540: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
6550: 64 20 69 6e 74 20 69 3b 0a 20 20 47 65 6f 43 6f  d int i;.  GeoCo
6560: 6f 72 64 20 2a 78 3b 0a 20 20 66 6f 72 28 69 3d  ord *x;.  for(i=
6570: 30 3b 20 69 3c 28 75 6e 73 69 67 6e 65 64 29 70  0; i<(unsigned)p
6580: 50 6f 6c 79 2d 3e 6e 56 65 72 74 65 78 2d 31 3b  Poly->nVertex-1;
6590: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 20 3d 20 70   i++){.    x = p
65a0: 50 6f 6c 79 2d 3e 61 20 2b 20 28 69 2a 32 29 3b  Poly->a + (i*2);
65b0: 0a 20 20 20 20 67 65 6f 70 6f 6c 79 41 64 64 4f  .    geopolyAddO
65c0: 6e 65 53 65 67 6d 65 6e 74 28 70 2c 20 78 5b 30  neSegment(p, x[0
65d0: 5d 2c 20 78 5b 31 5d 2c 20 78 5b 32 5d 2c 20 78  ], x[1], x[2], x
65e0: 5b 33 5d 2c 20 73 69 64 65 2c 20 69 29 3b 0a 20  [3], side, i);. 
65f0: 20 7d 0a 20 20 78 20 3d 20 70 50 6f 6c 79 2d 3e   }.  x = pPoly->
6600: 61 20 2b 20 28 69 2a 32 29 3b 0a 20 20 67 65 6f  a + (i*2);.  geo
6610: 70 6f 6c 79 41 64 64 4f 6e 65 53 65 67 6d 65 6e  polyAddOneSegmen
6620: 74 28 70 2c 20 78 5b 30 5d 2c 20 78 5b 31 5d 2c  t(p, x[0], x[1],
6630: 20 70 50 6f 6c 79 2d 3e 61 5b 30 5d 2c 20 70 50   pPoly->a[0], pP
6640: 6f 6c 79 2d 3e 61 5b 31 5d 2c 20 73 69 64 65 2c  oly->a[1], side,
6650: 20 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   i);.}../*.** Me
6660: 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
6670: 20 73 6f 72 74 65 64 20 65 76 65 6e 74 73 20 62   sorted events b
6680: 79 20 58 20 63 6f 6f 72 64 69 6e 61 74 65 0a 2a  y X coordinate.*
6690: 2f 0a 73 74 61 74 69 63 20 47 65 6f 45 76 65 6e  /.static GeoEven
66a0: 74 20 2a 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d  t *geopolyEventM
66b0: 65 72 67 65 28 47 65 6f 45 76 65 6e 74 20 2a 70  erge(GeoEvent *p
66c0: 4c 65 66 74 2c 20 47 65 6f 45 76 65 6e 74 20 2a  Left, GeoEvent *
66d0: 70 52 69 67 68 74 29 7b 0a 20 20 47 65 6f 45 76  pRight){.  GeoEv
66e0: 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74  ent head, *pLast
66f0: 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d  ;.  head.pNext =
6700: 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68   0;.  pLast = &h
6710: 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ead;.  while( pR
6720: 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b  ight && pLeft ){
6730: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
6740: 3e 78 20 3c 3d 20 70 4c 65 66 74 2d 3e 78 20 29  >x <= pLeft->x )
6750: 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70  {.      pLast->p
6760: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
6770: 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69       pLast = pRi
6780: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68  ght;.      pRigh
6790: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78  t = pRight->pNex
67a0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
67b0: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
67c0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
67d0: 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLast = pLeft;. 
67e0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65       pLeft = pLe
67f0: 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ft->pNext;.    }
6800: 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e  .  }.  pLast->pN
6810: 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70  ext = pRight ? p
6820: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
6830: 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65   return head.pNe
6840: 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xt;  .}../*.** S
6850: 6f 72 74 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ort an array of 
6860: 6e 45 76 65 6e 74 20 65 76 65 6e 74 20 6f 62 6a  nEvent event obj
6870: 65 63 74 73 20 69 6e 74 6f 20 61 20 6c 69 73 74  ects into a list
6880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47 65 6f 45  ..*/.static GeoE
6890: 76 65 6e 74 20 2a 67 65 6f 70 6f 6c 79 53 6f 72  vent *geopolySor
68a0: 74 45 76 65 6e 74 73 42 79 58 28 47 65 6f 45 76  tEventsByX(GeoEv
68b0: 65 6e 74 20 2a 61 45 76 65 6e 74 2c 20 69 6e 74  ent *aEvent, int
68c0: 20 6e 45 76 65 6e 74 29 7b 0a 20 20 69 6e 74 20   nEvent){.  int 
68d0: 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  mx = 0;.  int i,
68e0: 20 6a 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a   j;.  GeoEvent *
68f0: 70 3b 0a 20 20 47 65 6f 45 76 65 6e 74 20 2a 61  p;.  GeoEvent *a
6900: 5b 35 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [50];.  for(i=0;
6910: 20 69 3c 6e 45 76 65 6e 74 3b 20 69 2b 2b 29 7b   i<nEvent; i++){
6920: 0a 20 20 20 20 70 20 3d 20 26 61 45 76 65 6e 74  .    p = &aEvent
6930: 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  [i];.    p->pNex
6940: 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  t = 0;.    for(j
6950: 3d 30 3b 20 6a 3c 6d 78 20 26 26 20 61 5b 6a 5d  =0; j<mx && a[j]
6960: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20  ; j++){.      p 
6970: 3d 20 67 65 6f 70 6f 6c 79 45 76 65 6e 74 4d 65  = geopolyEventMe
6980: 72 67 65 28 61 5b 6a 5d 2c 20 70 29 3b 0a 20 20  rge(a[j], p);.  
6990: 20 20 20 20 61 5b 6a 5d 20 3d 20 30 3b 0a 20 20      a[j] = 0;.  
69a0: 20 20 7d 0a 20 20 20 20 61 5b 6a 5d 20 3d 20 70    }.    a[j] = p
69b0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6d 78 20  ;.    if( j>=mx 
69c0: 29 20 6d 78 20 3d 20 6a 2b 31 3b 0a 20 20 7d 0a  ) mx = j+1;.  }.
69d0: 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    p = 0;.  for(i
69e0: 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a  =0; i<mx; i++){.
69f0: 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79 45      p = geopolyE
6a00: 76 65 6e 74 4d 65 72 67 65 28 61 5b 69 5d 2c 20  ventMerge(a[i], 
6a10: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
6a20: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72   p;.}../*.** Mer
6a30: 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20  ge two lists of 
6a40: 73 6f 72 74 65 64 20 73 65 67 6d 65 6e 74 73 20  sorted segments 
6a50: 62 79 20 59 2c 20 61 6e 64 20 74 68 65 6e 20 62  by Y, and then b
6a60: 79 20 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 47  y C..*/.static G
6a70: 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f 70 6f  eoSegment *geopo
6a80: 6c 79 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 47  lySegmentMerge(G
6a90: 65 6f 53 65 67 6d 65 6e 74 20 2a 70 4c 65 66 74  eoSegment *pLeft
6aa0: 2c 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 70 52  , GeoSegment *pR
6ab0: 69 67 68 74 29 7b 0a 20 20 47 65 6f 53 65 67 6d  ight){.  GeoSegm
6ac0: 65 6e 74 20 68 65 61 64 2c 20 2a 70 4c 61 73 74  ent head, *pLast
6ad0: 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78 74 20 3d  ;.  head.pNext =
6ae0: 20 30 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 68   0;.  pLast = &h
6af0: 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ead;.  while( pR
6b00: 69 67 68 74 20 26 26 20 70 4c 65 66 74 20 29 7b  ight && pLeft ){
6b10: 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20  .    double r = 
6b20: 70 52 69 67 68 74 2d 3e 79 20 2d 20 70 4c 65 66  pRight->y - pLef
6b30: 74 2d 3e 79 3b 0a 20 20 20 20 69 66 28 20 72 3d  t->y;.    if( r=
6b40: 3d 30 2e 30 20 29 20 72 20 3d 20 70 52 69 67 68  =0.0 ) r = pRigh
6b50: 74 2d 3e 43 20 2d 20 70 4c 65 66 74 2d 3e 43 3b  t->C - pLeft->C;
6b60: 0a 20 20 20 20 69 66 28 20 72 3c 30 2e 30 20 29  .    if( r<0.0 )
6b70: 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 3e 70  {.      pLast->p
6b80: 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
6b90: 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70 52 69       pLast = pRi
6ba0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68  ght;.      pRigh
6bb0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4e 65 78  t = pRight->pNex
6bc0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
6bd0: 20 20 20 20 70 4c 61 73 74 2d 3e 70 4e 65 78 74      pLast->pNext
6be0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6bf0: 70 4c 61 73 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLast = pLeft;. 
6c00: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65       pLeft = pLe
6c10: 66 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ft->pNext;.    }
6c20: 0a 20 20 7d 0a 20 20 70 4c 61 73 74 2d 3e 70 4e  .  }.  pLast->pN
6c30: 65 78 74 20 3d 20 70 52 69 67 68 74 20 3f 20 70  ext = pRight ? p
6c40: 52 69 67 68 74 20 3a 20 70 4c 65 66 74 3b 0a 20  Right : pLeft;. 
6c50: 20 72 65 74 75 72 6e 20 68 65 61 64 2e 70 4e 65   return head.pNe
6c60: 78 74 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xt;  .}../*.** S
6c70: 6f 72 74 20 61 20 6c 69 73 74 20 6f 66 20 47 65  ort a list of Ge
6c80: 6f 53 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64  oSegments in ord
6c90: 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  er of increasing
6ca0: 20 59 20 61 6e 64 20 69 6e 20 74 68 65 20 65 76   Y and in the ev
6cb0: 65 6e 74 20 6f 66 0a 2a 2a 20 61 20 74 69 65 2c  ent of.** a tie,
6cc0: 20 69 6e 63 72 65 61 73 69 6e 67 20 43 20 28 73   increasing C (s
6cd0: 6c 6f 70 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lope)..*/.static
6ce0: 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a 67 65 6f   GeoSegment *geo
6cf0: 70 6f 6c 79 53 6f 72 74 53 65 67 6d 65 6e 74 73  polySortSegments
6d00: 42 79 59 41 6e 64 43 28 47 65 6f 53 65 67 6d 65  ByYAndC(GeoSegme
6d10: 6e 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  nt *pList){.  in
6d20: 74 20 6d 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t mx = 0;.  int 
6d30: 69 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20  i;.  GeoSegment 
6d40: 2a 70 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74  *p;.  GeoSegment
6d50: 20 2a 61 5b 35 30 5d 3b 0a 20 20 77 68 69 6c 65   *a[50];.  while
6d60: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70  ( pList ){.    p
6d70: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c   = pList;.    pL
6d80: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 4e 65  ist = pList->pNe
6d90: 78 74 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  xt;.    p->pNext
6da0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
6db0: 30 3b 20 69 3c 6d 78 20 26 26 20 61 5b 69 5d 3b  0; i<mx && a[i];
6dc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d   i++){.      p =
6dd0: 20 67 65 6f 70 6f 6c 79 53 65 67 6d 65 6e 74 4d   geopolySegmentM
6de0: 65 72 67 65 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  erge(a[i], p);. 
6df0: 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
6e00: 20 20 20 7d 0a 20 20 20 20 61 5b 69 5d 20 3d 20     }.    a[i] = 
6e10: 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6d 78  p;.    if( i>=mx
6e20: 20 29 20 6d 78 20 3d 20 69 2b 31 3b 0a 20 20 7d   ) mx = i+1;.  }
6e30: 0a 20 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  p = 0;.  for(
6e40: 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b  i=0; i<mx; i++){
6e50: 0a 20 20 20 20 70 20 3d 20 67 65 6f 70 6f 6c 79  .    p = geopoly
6e60: 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 61 5b 69  SegmentMerge(a[i
6e70: 5d 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ], p);.  }.  ret
6e80: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
6e90: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6f 76  Determine the ov
6ea0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 77  erlap between tw
6eb0: 6f 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74  o polygons.*/.st
6ec0: 61 74 69 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79  atic int geopoly
6ed0: 4f 76 65 72 6c 61 70 28 47 65 6f 50 6f 6c 79 20  Overlap(GeoPoly 
6ee0: 2a 70 31 2c 20 47 65 6f 50 6f 6c 79 20 2a 70 32  *p1, GeoPoly *p2
6ef0: 29 7b 0a 20 20 69 6e 74 20 6e 56 65 72 74 65 78  ){.  int nVertex
6f00: 20 3d 20 70 31 2d 3e 6e 56 65 72 74 65 78 20 2b   = p1->nVertex +
6f10: 20 70 32 2d 3e 6e 56 65 72 74 65 78 20 2b 20 32   p2->nVertex + 2
6f20: 3b 0a 20 20 47 65 6f 4f 76 65 72 6c 61 70 20 2a  ;.  GeoOverlap *
6f30: 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  p;.  int nByte;.
6f40: 20 20 47 65 6f 45 76 65 6e 74 20 2a 70 54 68 69    GeoEvent *pThi
6f50: 73 45 76 65 6e 74 3b 0a 20 20 64 6f 75 62 6c 65  sEvent;.  double
6f60: 20 72 58 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   rX;.  int rc = 
6f70: 30 3b 0a 20 20 69 6e 74 20 6e 65 65 64 53 6f 72  0;.  int needSor
6f80: 74 20 3d 20 30 3b 0a 20 20 47 65 6f 53 65 67 6d  t = 0;.  GeoSegm
6f90: 65 6e 74 20 2a 70 41 63 74 69 76 65 20 3d 20 30  ent *pActive = 0
6fa0: 3b 0a 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a  ;.  GeoSegment *
6fb0: 70 53 65 67 3b 0a 20 20 75 6e 73 69 67 6e 65 64  pSeg;.  unsigned
6fc0: 20 63 68 61 72 20 61 4f 76 65 72 6c 61 70 5b 34   char aOverlap[4
6fd0: 5d 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  ];..  nByte = si
6fe0: 7a 65 6f 66 28 47 65 6f 45 76 65 6e 74 29 2a 6e  zeof(GeoEvent)*n
6ff0: 56 65 72 74 65 78 2a 32 20 0a 20 20 20 20 20 20  Vertex*2 .      
7000: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 47 65       + sizeof(Ge
7010: 6f 53 65 67 6d 65 6e 74 29 2a 6e 56 65 72 74 65  oSegment)*nVerte
7020: 78 20 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20  x .           + 
7030: 73 69 7a 65 6f 66 28 47 65 6f 4f 76 65 72 6c 61  sizeof(GeoOverla
7040: 70 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  p);.  p = sqlite
7050: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  3_malloc( nByte 
7060: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
7070: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 70 2d 3e  return -1;.  p->
7080: 61 45 76 65 6e 74 20 3d 20 28 47 65 6f 45 76 65  aEvent = (GeoEve
7090: 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e  nt*)&p[1];.  p->
70a0: 61 53 65 67 6d 65 6e 74 20 3d 20 28 47 65 6f 53  aSegment = (GeoS
70b0: 65 67 6d 65 6e 74 2a 29 26 70 2d 3e 61 45 76 65  egment*)&p->aEve
70c0: 6e 74 5b 6e 56 65 72 74 65 78 2a 32 5d 3b 0a 20  nt[nVertex*2];. 
70d0: 20 70 2d 3e 6e 45 76 65 6e 74 20 3d 20 70 2d 3e   p->nEvent = p->
70e0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
70f0: 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e  geopolyAddSegmen
7100: 74 73 28 70 2c 20 70 31 2c 20 31 29 3b 0a 20 20  ts(p, p1, 1);.  
7110: 67 65 6f 70 6f 6c 79 41 64 64 53 65 67 6d 65 6e  geopolyAddSegmen
7120: 74 73 28 70 2c 20 70 32 2c 20 32 29 3b 0a 20 20  ts(p, p2, 2);.  
7130: 70 54 68 69 73 45 76 65 6e 74 20 3d 20 67 65 6f  pThisEvent = geo
7140: 70 6f 6c 79 53 6f 72 74 45 76 65 6e 74 73 42 79  polySortEventsBy
7150: 58 28 70 2d 3e 61 45 76 65 6e 74 2c 20 70 2d 3e  X(p->aEvent, p->
7160: 6e 45 76 65 6e 74 29 3b 0a 20 20 72 58 20 3d 20  nEvent);.  rX = 
7170: 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3d 3d 30  pThisEvent->x==0
7180: 2e 30 20 3f 20 2d 31 2e 30 20 3a 20 30 2e 30 3b  .0 ? -1.0 : 0.0;
7190: 0a 20 20 6d 65 6d 73 65 74 28 61 4f 76 65 72 6c  .  memset(aOverl
71a0: 61 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4f  ap, 0, sizeof(aO
71b0: 76 65 72 6c 61 70 29 29 3b 0a 20 20 77 68 69 6c  verlap));.  whil
71c0: 65 28 20 70 54 68 69 73 45 76 65 6e 74 20 29 7b  e( pThisEvent ){
71d0: 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 45 76  .    if( pThisEv
71e0: 65 6e 74 2d 3e 78 21 3d 72 58 20 29 7b 0a 20 20  ent->x!=rX ){.  
71f0: 20 20 20 20 47 65 6f 53 65 67 6d 65 6e 74 20 2a      GeoSegment *
7200: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
7210: 20 69 6e 74 20 69 4d 61 73 6b 20 3d 20 30 3b 0a   int iMask = 0;.
7220: 20 20 20 20 20 20 47 45 4f 44 45 42 55 47 28 28        GEODEBUG((
7230: 22 44 69 73 74 69 6e 63 74 20 58 3a 20 25 67 5c  "Distinct X: %g\
7240: 6e 22 2c 20 70 54 68 69 73 45 76 65 6e 74 2d 3e  n", pThisEvent->
7250: 78 29 29 3b 0a 20 20 20 20 20 20 72 58 20 3d 20  x));.      rX = 
7260: 70 54 68 69 73 45 76 65 6e 74 2d 3e 78 3b 0a 20  pThisEvent->x;. 
7270: 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 6f 72       if( needSor
7280: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 47 45 4f  t ){.        GEO
7290: 44 45 42 55 47 28 28 22 53 4f 52 54 5c 6e 22 29  DEBUG(("SORT\n")
72a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 63 74 69  );.        pActi
72b0: 76 65 20 3d 20 67 65 6f 70 6f 6c 79 53 6f 72 74  ve = geopolySort
72c0: 53 65 67 6d 65 6e 74 73 42 79 59 41 6e 64 43 28  SegmentsByYAndC(
72d0: 70 41 63 74 69 76 65 29 3b 0a 20 20 20 20 20 20  pActive);.      
72e0: 20 20 6e 65 65 64 53 6f 72 74 20 3d 20 30 3b 0a    needSort = 0;.
72f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
7300: 72 28 70 53 65 67 3d 70 41 63 74 69 76 65 3b 20  r(pSeg=pActive; 
7310: 70 53 65 67 3b 20 70 53 65 67 3d 70 53 65 67 2d  pSeg; pSeg=pSeg-
7320: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
7330: 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20   if( pPrev ){.  
7340: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
7350: 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79 20 29 7b  v->y!=pSeg->y ){
7360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 45 4f  .            GEO
7370: 44 45 42 55 47 28 28 22 4d 41 53 4b 3a 20 25 64  DEBUG(("MASK: %d
7380: 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b 0a 20 20  \n", iMask));.  
7390: 20 20 20 20 20 20 20 20 20 20 61 4f 76 65 72 6c            aOverl
73a0: 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31 3b 0a 20  ap[iMask] = 1;. 
73b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
73c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4d 61     }.        iMa
73d0: 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73 69 64 65  sk ^= pSeg->side
73e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  ;.        pPrev 
73f0: 3d 20 70 53 65 67 3b 0a 20 20 20 20 20 20 7d 0a  = pSeg;.      }.
7400: 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 30 3b        pPrev = 0;
7410: 0a 20 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d  .      for(pSeg=
7420: 70 41 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70  pActive; pSeg; p
7430: 53 65 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29  Seg=pSeg->pNext)
7440: 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
7450: 20 79 20 3d 20 70 53 65 67 2d 3e 43 2a 72 58 20   y = pSeg->C*rX 
7460: 2b 20 70 53 65 67 2d 3e 42 3b 0a 20 20 20 20 20  + pSeg->B;.     
7470: 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 53 65     GEODEBUG(("Se
7480: 67 6d 65 6e 74 20 25 64 2e 25 64 20 25 67 2d 3e  gment %d.%d %g->
7490: 25 67 5c 6e 22 2c 20 70 53 65 67 2d 3e 73 69 64  %g\n", pSeg->sid
74a0: 65 2c 20 70 53 65 67 2d 3e 69 64 78 2c 20 70 53  e, pSeg->idx, pS
74b0: 65 67 2d 3e 79 2c 20 79 29 29 3b 0a 20 20 20 20  eg->y, y));.    
74c0: 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 79 3b      pSeg->y = y;
74d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
74e0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
74f0: 69 66 28 20 70 50 72 65 76 2d 3e 79 3e 70 53 65  if( pPrev->y>pSe
7500: 67 2d 3e 79 20 26 26 20 70 50 72 65 76 2d 3e 73  g->y && pPrev->s
7510: 69 64 65 21 3d 70 53 65 67 2d 3e 73 69 64 65 20  ide!=pSeg->side 
7520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
7530: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
7540: 20 20 20 47 45 4f 44 45 42 55 47 28 28 22 43 72     GEODEBUG(("Cr
7550: 6f 73 73 69 6e 67 3a 20 25 64 2e 25 64 20 61 6e  ossing: %d.%d an
7560: 64 20 25 64 2e 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d.%d\n",.    
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 70 50 72 65 76 2d 3e 73 69 64 65 2c 20 70 50 72  pPrev->side, pPr
7590: 65 76 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20  ev->idx,.       
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
75b0: 67 2d 3e 73 69 64 65 2c 20 70 53 65 67 2d 3e 69  g->side, pSeg->i
75c0: 64 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dx));.          
75d0: 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 4f 76    goto geopolyOv
75e0: 65 72 6c 61 70 44 6f 6e 65 3b 0a 20 20 20 20 20  erlapDone;.     
75f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7600: 50 72 65 76 2d 3e 79 21 3d 70 53 65 67 2d 3e 79  Prev->y!=pSeg->y
7610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7620: 47 45 4f 44 45 42 55 47 28 28 22 4d 41 53 4b 3a  GEODEBUG(("MASK:
7630: 20 25 64 5c 6e 22 2c 20 69 4d 61 73 6b 29 29 3b   %d\n", iMask));
7640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4f 76  .            aOv
7650: 65 72 6c 61 70 5b 69 4d 61 73 6b 5d 20 3d 20 31  erlap[iMask] = 1
7660: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7680: 69 4d 61 73 6b 20 5e 3d 20 70 53 65 67 2d 3e 73  iMask ^= pSeg->s
7690: 69 64 65 3b 0a 20 20 20 20 20 20 20 20 70 50 72  ide;.        pPr
76a0: 65 76 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20  ev = pSeg;.     
76b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 47 45 4f   }.    }.    GEO
76c0: 44 45 42 55 47 28 28 22 25 73 20 25 64 2e 25 64  DEBUG(("%s %d.%d
76d0: 20 43 3d 25 67 20 42 3d 25 67 5c 6e 22 2c 0a 20   C=%g B=%g\n",. 
76e0: 20 20 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d       pThisEvent-
76f0: 3e 65 54 79 70 65 20 3f 20 22 52 4d 20 22 20 3a  >eType ? "RM " :
7700: 20 22 41 44 44 22 2c 0a 20 20 20 20 20 20 70 54   "ADD",.      pT
7710: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e  hisEvent->pSeg->
7720: 73 69 64 65 2c 20 70 54 68 69 73 45 76 65 6e 74  side, pThisEvent
7730: 2d 3e 70 53 65 67 2d 3e 69 64 78 2c 0a 20 20 20  ->pSeg->idx,.   
7740: 20 20 20 70 54 68 69 73 45 76 65 6e 74 2d 3e 70     pThisEvent->p
7750: 53 65 67 2d 3e 43 2c 0a 20 20 20 20 20 20 70 54  Seg->C,.      pT
7760: 68 69 73 45 76 65 6e 74 2d 3e 70 53 65 67 2d 3e  hisEvent->pSeg->
7770: 42 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  B));.    if( pTh
7780: 69 73 45 76 65 6e 74 2d 3e 65 54 79 70 65 3d 3d  isEvent->eType==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  0 ){.      /* Ad
77a0: 64 20 61 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  d a segment */. 
77b0: 20 20 20 20 20 70 53 65 67 20 3d 20 70 54 68 69       pSeg = pThi
77c0: 73 45 76 65 6e 74 2d 3e 70 53 65 67 3b 0a 20 20  sEvent->pSeg;.  
77d0: 20 20 20 20 70 53 65 67 2d 3e 79 20 3d 20 70 53      pSeg->y = pS
77e0: 65 67 2d 3e 79 30 3b 0a 20 20 20 20 20 20 70 53  eg->y0;.      pS
77f0: 65 67 2d 3e 70 4e 65 78 74 20 3d 20 70 41 63 74  eg->pNext = pAct
7800: 69 76 65 3b 0a 20 20 20 20 20 20 70 41 63 74 69  ive;.      pActi
7810: 76 65 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 20  ve = pSeg;.     
7820: 20 6e 65 65 64 53 6f 72 74 20 3d 20 31 3b 0a 20   needSort = 1;. 
7830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7840: 2f 2a 20 52 65 6d 6f 76 65 20 61 20 73 65 67 6d  /* Remove a segm
7850: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ent */.      if(
7860: 20 70 41 63 74 69 76 65 3d 3d 70 54 68 69 73 45   pActive==pThisE
7870: 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20 20  vent->pSeg ){.  
7880: 20 20 20 20 20 20 70 41 63 74 69 76 65 20 3d 20        pActive = 
7890: 70 41 63 74 69 76 65 2d 3e 70 4e 65 78 74 3b 0a  pActive->pNext;.
78a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
78b0: 20 20 20 20 20 66 6f 72 28 70 53 65 67 3d 70 41       for(pSeg=pA
78c0: 63 74 69 76 65 3b 20 70 53 65 67 3b 20 70 53 65  ctive; pSeg; pSe
78d0: 67 3d 70 53 65 67 2d 3e 70 4e 65 78 74 29 7b 0a  g=pSeg->pNext){.
78e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
78f0: 65 67 2d 3e 70 4e 65 78 74 3d 3d 70 54 68 69 73  eg->pNext==pThis
7900: 45 76 65 6e 74 2d 3e 70 53 65 67 20 29 7b 0a 20  Event->pSeg ){. 
7910: 20 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d             pSeg-
7920: 3e 70 4e 65 78 74 20 3d 20 70 53 65 67 2d 3e 70  >pNext = pSeg->p
7930: 4e 65 78 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Next->pNext;.   
7940: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7950: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7970: 20 20 7d 0a 20 20 20 20 70 54 68 69 73 45 76 65    }.    pThisEve
7980: 6e 74 20 3d 20 70 54 68 69 73 45 76 65 6e 74 2d  nt = pThisEvent-
7990: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
79a0: 28 20 61 4f 76 65 72 6c 61 70 5b 33 5d 3d 3d 30  ( aOverlap[3]==0
79b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
79c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4f 76 65    }else if( aOve
79d0: 72 6c 61 70 5b 31 5d 21 3d 30 20 26 26 20 61 4f  rlap[1]!=0 && aO
79e0: 76 65 72 6c 61 70 5b 32 5d 3d 3d 30 20 29 7b 0a  verlap[2]==0 ){.
79f0: 20 20 20 20 72 63 20 3d 20 33 3b 0a 20 20 7d 65      rc = 3;.  }e
7a00: 6c 73 65 20 69 66 28 20 61 4f 76 65 72 6c 61 70  lse if( aOverlap
7a10: 5b 31 5d 3d 3d 30 20 26 26 20 61 4f 76 65 72 6c  [1]==0 && aOverl
7a20: 61 70 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20  ap[2]!=0 ){.    
7a30: 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 20  rc = 2;.  }else 
7a40: 69 66 28 20 61 4f 76 65 72 6c 61 70 5b 31 5d 3d  if( aOverlap[1]=
7a50: 3d 30 20 26 26 20 61 4f 76 65 72 6c 61 70 5b 32  =0 && aOverlap[2
7a60: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ]==0 ){.    rc =
7a70: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
7a80: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 67 65   rc = 1;.  }..ge
7a90: 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 44 6f 6e 65  opolyOverlapDone
7aa0: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
7ab0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
7ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
7ad0: 75 6e 63 74 69 6f 6e 3a 20 20 20 20 67 65 6f 70  unction:    geop
7ae0: 6f 6c 79 5f 6f 76 65 72 6c 61 70 28 50 31 2c 50  oly_overlap(P1,P
7af0: 32 29 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  2).**.** Determi
7b00: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7b10: 74 20 50 31 20 61 6e 64 20 50 32 20 6f 76 65 72  t P1 and P2 over
7b20: 6c 61 70 2e 20 52 65 74 75 72 6e 20 76 61 6c 75  lap. Return valu
7b30: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20 20 20  e:.**.**   0    
7b40: 20 54 68 65 20 74 77 6f 20 70 6f 6c 79 67 6f 6e   The two polygon
7b50: 73 20 61 72 65 20 64 69 73 6a 6f 69 6e 74 0a 2a  s are disjoint.*
7b60: 2a 20 20 20 31 20 20 20 20 20 54 68 65 79 20 6f  *   1     They o
7b70: 76 65 72 6c 61 70 0a 2a 2a 20 20 20 32 20 20 20  verlap.**   2   
7b80: 20 20 50 31 20 69 73 20 63 6f 6d 70 6c 65 74 65    P1 is complete
7b90: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ly contained wit
7ba0: 68 69 6e 20 50 32 0a 2a 2a 20 20 20 33 20 20 20  hin P2.**   3   
7bb0: 20 20 50 32 20 69 73 20 63 6f 6d 70 6c 65 74 65    P2 is complete
7bc0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ly contained wit
7bd0: 68 69 6e 20 50 31 0a 2a 2a 20 20 20 34 20 20 20  hin P1.**   4   
7be0: 20 20 50 31 20 61 6e 64 20 50 32 20 61 72 65 20    P1 and P2 are 
7bf0: 74 68 65 20 73 61 6d 65 20 70 6f 6c 79 67 6f 6e  the same polygon
7c00: 0a 2a 2a 20 20 20 4e 55 4c 4c 20 20 45 69 74 68  .**   NULL  Eith
7c10: 65 72 20 50 31 20 6f 72 20 50 32 20 6f 72 20 62  er P1 or P2 or b
7c20: 6f 74 68 20 61 72 65 20 6e 6f 74 20 76 61 6c 69  oth are not vali
7c30: 64 20 70 6f 6c 79 67 6f 6e 73 0a 2a 2f 0a 73 74  d polygons.*/.st
7c40: 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70 6f 6c  atic void geopol
7c50: 79 4f 76 65 72 6c 61 70 46 75 6e 63 28 0a 20 20  yOverlapFunc(.  
7c60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7c70: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7c80: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7c90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7ca0: 20 20 47 65 6f 50 6f 6c 79 20 2a 70 31 20 3d 20    GeoPoly *p1 = 
7cb0: 67 65 6f 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d  geopolyFuncParam
7cc0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
7cd0: 5d 2c 20 30 29 3b 0a 20 20 47 65 6f 50 6f 6c 79  ], 0);.  GeoPoly
7ce0: 20 2a 70 32 20 3d 20 67 65 6f 70 6f 6c 79 46 75   *p2 = geopolyFu
7cf0: 6e 63 50 61 72 61 6d 28 63 6f 6e 74 65 78 74 2c  ncParam(context,
7d00: 20 61 72 67 76 5b 31 5d 2c 20 30 29 3b 0a 20 20   argv[1], 0);.  
7d10: 69 66 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a  if( p1 && p2 ){.
7d20: 20 20 20 20 69 6e 74 20 78 20 3d 20 67 65 6f 70      int x = geop
7d30: 6f 6c 79 4f 76 65 72 6c 61 70 28 70 31 2c 20 70  olyOverlap(p1, p
7d40: 32 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20  2);.    if( x<0 
7d50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
7d70: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
7d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7d90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
7da0: 74 28 63 6f 6e 74 65 78 74 2c 20 78 29 3b 0a 20  t(context, x);. 
7db0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7dc0: 65 33 5f 66 72 65 65 28 70 31 29 3b 0a 20 20 73  e3_free(p1);.  s
7dd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 32 29 3b  qlite3_free(p2);
7de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
7df0: 20 6f 72 20 64 69 73 61 62 6c 65 20 64 65 62 75   or disable debu
7e00: 67 67 69 6e 67 20 6f 75 74 70 75 74 0a 2a 2f 0a  gging output.*/.
7e10: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6f 70  static void geop
7e20: 6f 6c 79 44 65 62 75 67 46 75 6e 63 28 0a 20 20  olyDebugFunc(.  
7e30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7e40: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7e50: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7e60: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7e70: 23 69 66 64 65 66 20 47 45 4f 50 4f 4c 59 5f 45  #ifdef GEOPOLY_E
7e80: 4e 41 42 4c 45 5f 44 45 42 55 47 0a 20 20 67 65  NABLE_DEBUG.  ge
7e90: 6f 5f 64 65 62 75 67 20 3d 20 73 71 6c 69 74 65  o_debug = sqlite
7ea0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
7eb0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  [0]);.#endif.}..
7ec0: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
7ed0: 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
7ee0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
7ef0: 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
7f00: 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
7f10: 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 67 65  ethods of the ge
7f20: 6f 70 6f 6c 79 20 76 69 72 74 75 61 6c 20 74 61  opoly virtual ta
7f30: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67  ble..**.**   arg
7f40: 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65  v[0]   -> module
7f50: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
7f60: 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65  1]   -> database
7f70: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
7f80: 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61  2]   -> table na
7f90: 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e  me.**   argv[...
7fa0: 5d 20 2d 3e 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ] -> column name
7fb0: 73 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s....*/.static i
7fc0: 6e 74 20 67 65 6f 70 6f 6c 79 49 6e 69 74 28 0a  nt geopolyInit(.
7fd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8000: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8010: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20    void *pAux,   
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8040: 74 68 65 20 52 54 52 45 45 5f 43 4f 4f 52 44 5f  the RTREE_COORD_
8050: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
8060: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
8070: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
8080: 76 2c 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  v,   /* Paramete
8090: 72 73 20 74 6f 20 43 52 45 41 54 45 20 54 41 42  rs to CREATE TAB
80a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
80b0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
80c0: 2a 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20  *ppVtab,        
80d0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
80e0: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  w virtual table 
80f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
8100: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8120: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20   Error message, 
8130: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
8140: 69 73 43 72 65 61 74 65 20 20 20 20 20 20 20 20  isCreate        
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 2f 2a 20 54 72 75 65 20 66 6f 72 20 78 43 72 65  /* True for xCre
8170: 61 74 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 78  ate, false for x
8180: 43 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 20 20  Connect */.){.  
8190: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
81a0: 4f 4b 3b 0a 20 20 52 74 72 65 65 20 2a 70 52 74  OK;.  Rtree *pRt
81b0: 72 65 65 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 20  ree;.  int nDb; 
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
81e0: 20 61 72 67 76 5b 31 5d 20 2a 2f 0a 20 20 69 6e   argv[1] */.  in
81f0: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
8200: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
8210: 20 73 74 72 69 6e 67 20 61 72 67 76 5b 32 5d 20   string argv[2] 
8220: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  */.  sqlite3_str
8230: 20 2a 70 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *pSql;.  char *
8240: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  zSql;.  int ii;.
8250: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
8260: 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
8270: 45 5f 56 54 41 42 5f 43 4f 4e 53 54 52 41 49 4e  E_VTAB_CONSTRAIN
8280: 54 5f 53 55 50 50 4f 52 54 2c 20 31 29 3b 0a 0a  T_SUPPORT, 1);..
8290: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
82a0: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
82b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6e 44  tructure */.  nD
82c0: 62 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  b = (int)strlen(
82d0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 4e 61 6d  argv[1]);.  nNam
82e0: 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
82f0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 70 52 74 72  argv[2]);.  pRtr
8300: 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29 73 71  ee = (Rtree *)sq
8310: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
8320: 65 6f 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e  eof(Rtree)+nDb+n
8330: 4e 61 6d 65 2b 32 29 3b 0a 20 20 69 66 28 20 21  Name+2);.  if( !
8340: 70 52 74 72 65 65 20 29 7b 0a 20 20 20 20 72 65  pRtree ){.    re
8350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8360: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
8370: 70 52 74 72 65 65 2c 20 30 2c 20 73 69 7a 65 6f  pRtree, 0, sizeo
8380: 66 28 52 74 72 65 65 29 2b 6e 44 62 2b 6e 4e 61  f(Rtree)+nDb+nNa
8390: 6d 65 2b 32 29 3b 0a 20 20 70 52 74 72 65 65 2d  me+2);.  pRtree-
83a0: 3e 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 70 52  >nBusy = 1;.  pR
83b0: 74 72 65 65 2d 3e 62 61 73 65 2e 70 4d 6f 64 75  tree->base.pModu
83c0: 6c 65 20 3d 20 26 72 74 72 65 65 4d 6f 64 75 6c  le = &rtreeModul
83d0: 65 3b 0a 20 20 70 52 74 72 65 65 2d 3e 7a 44 62  e;.  pRtree->zDb
83e0: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 74 72   = (char *)&pRtr
83f0: 65 65 5b 31 5d 3b 0a 20 20 70 52 74 72 65 65 2d  ee[1];.  pRtree-
8400: 3e 7a 4e 61 6d 65 20 3d 20 26 70 52 74 72 65 65  >zName = &pRtree
8410: 2d 3e 7a 44 62 5b 6e 44 62 2b 31 5d 3b 0a 20 20  ->zDb[nDb+1];.  
8420: 70 52 74 72 65 65 2d 3e 65 43 6f 6f 72 64 54 79  pRtree->eCoordTy
8430: 70 65 20 3d 20 52 54 52 45 45 5f 43 4f 4f 52 44  pe = RTREE_COORD
8440: 5f 52 45 41 4c 33 32 3b 0a 20 20 70 52 74 72 65  _REAL32;.  pRtre
8450: 65 2d 3e 6e 44 69 6d 20 3d 20 32 3b 0a 20 20 70  e->nDim = 2;.  p
8460: 52 74 72 65 65 2d 3e 6e 44 69 6d 32 20 3d 20 34  Rtree->nDim2 = 4
8470: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 52 74 72 65  ;.  memcpy(pRtre
8480: 65 2d 3e 7a 44 62 2c 20 61 72 67 76 5b 31 5d 2c  e->zDb, argv[1],
8490: 20 6e 44 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28   nDb);.  memcpy(
84a0: 70 52 74 72 65 65 2d 3e 7a 4e 61 6d 65 2c 20 61  pRtree->zName, a
84b0: 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b 0a  rgv[2], nName);.
84c0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 43 6f  ..  /* Create/Co
84d0: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 75 6e 64  nnect to the und
84e0: 65 72 6c 79 69 6e 67 20 72 65 6c 61 74 69 6f 6e  erlying relation
84f0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 63 68 65  al database sche
8500: 6d 61 2e 20 49 66 0a 20 20 2a 2a 20 74 68 61 74  ma. If.  ** that
8510: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
8520: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63  call sqlite3_dec
8530: 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20 63  lare_vtab() to c
8540: 6f 6e 66 69 67 75 72 65 0a 20 20 2a 2a 20 74 68  onfigure.  ** th
8550: 65 20 72 2d 74 72 65 65 20 74 61 62 6c 65 20 73  e r-tree table s
8560: 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 70 53  chema..  */.  pS
8570: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  ql = sqlite3_str
8580: 5f 6e 65 77 28 64 62 29 3b 0a 20 20 73 71 6c 69  _new(db);.  sqli
8590: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
85a0: 70 53 71 6c 2c 20 22 43 52 45 41 54 45 20 54 41  pSql, "CREATE TA
85b0: 42 4c 45 20 78 28 5f 73 68 61 70 65 22 29 3b 0a  BLE x(_shape");.
85c0: 20 20 70 52 74 72 65 65 2d 3e 6e 41 75 78 20 3d    pRtree->nAux =
85d0: 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   1;         /* A
85e0: 64 64 20 6f 6e 65 20 66 6f 72 20 5f 73 68 61 70  dd one for _shap
85f0: 65 20 2a 2f 0a 20 20 70 52 74 72 65 65 2d 3e 6e  e */.  pRtree->n
8600: 41 75 78 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 20  AuxNotNull = 1; 
8610: 20 2f 2a 20 54 68 65 20 5f 73 68 61 70 65 20 63   /* The _shape c
8620: 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 20  olumn is always 
8630: 6e 6f 74 2d 6e 75 6c 6c 20 2a 2f 0a 20 20 66 6f  not-null */.  fo
8640: 72 28 69 69 3d 33 3b 20 69 69 3c 61 72 67 63 3b  r(ii=3; ii<argc;
8650: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 52 74 72   ii++){.    pRtr
8660: 65 65 2d 3e 6e 41 75 78 2b 2b 3b 0a 20 20 20 20  ee->nAux++;.    
8670: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
8680: 6e 64 66 28 70 53 71 6c 2c 20 22 2c 25 73 22 2c  ndf(pSql, ",%s",
8690: 20 61 72 67 76 5b 69 69 5d 29 3b 0a 20 20 7d 0a   argv[ii]);.  }.
86a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
86b0: 70 65 6e 64 66 28 70 53 71 6c 2c 20 22 29 3b 22  pendf(pSql, ");"
86c0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
86d0: 74 65 33 5f 73 74 72 5f 66 69 6e 69 73 68 28 70  te3_str_finish(p
86e0: 53 71 6c 29 3b 0a 20 20 69 66 28 20 21 7a 53 71  Sql);.  if( !zSq
86f0: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
8700: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
8710: 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
8720: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
8730: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
8740: 2c 20 7a 53 71 6c 29 29 20 29 7b 0a 20 20 20 20  , zSql)) ){.    
8750: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
8760: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
8770: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
8780: 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
8790: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
87a0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 67 65  if( rc ) goto ge
87b0: 6f 70 6f 6c 79 49 6e 69 74 5f 66 61 69 6c 3b 0a  opolyInit_fail;.
87c0: 20 20 70 52 74 72 65 65 2d 3e 6e 42 79 74 65 73    pRtree->nBytes
87d0: 50 65 72 43 65 6c 6c 20 3d 20 38 20 2b 20 70 52  PerCell = 8 + pR
87e0: 74 72 65 65 2d 3e 6e 44 69 6d 32 2a 34 3b 0a 0a  tree->nDim2*4;..
87f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
8800: 74 68 65 20 6e 6f 64 65 20 73 69 7a 65 20 74 6f  the node size to
8810: 20 75 73 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20   use. */.  rc = 
8820: 67 65 74 4e 6f 64 65 53 69 7a 65 28 64 62 2c 20  getNodeSize(db, 
8830: 70 52 74 72 65 65 2c 20 69 73 43 72 65 61 74 65  pRtree, isCreate
8840: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  , pzErr);.  if( 
8850: 72 63 20 29 20 67 6f 74 6f 20 67 65 6f 70 6f 6c  rc ) goto geopol
8860: 79 49 6e 69 74 5f 66 61 69 6c 3b 0a 20 20 72 63  yInit_fail;.  rc
8870: 20 3d 20 72 74 72 65 65 53 71 6c 49 6e 69 74 28   = rtreeSqlInit(
8880: 70 52 74 72 65 65 2c 20 64 62 2c 20 61 72 67 76  pRtree, db, argv
8890: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 69 73  [1], argv[2], is
88a0: 43 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20 72  Create);.  if( r
88b0: 63 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20  c ){.    *pzErr 
88c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
88d0: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
88e0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
88f0: 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79 49 6e 69   goto geopolyIni
8900: 74 5f 66 61 69 6c 3b 0a 20 20 7d 0a 0a 20 20 2a  t_fail;.  }..  *
8910: 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
8920: 33 5f 76 74 61 62 20 2a 29 70 52 74 72 65 65 3b  3_vtab *)pRtree;
8930: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8940: 5f 4f 4b 3b 0a 0a 67 65 6f 70 6f 6c 79 49 6e 69  _OK;..geopolyIni
8950: 74 5f 66 61 69 6c 3a 0a 20 20 69 66 28 20 72 63  t_fail:.  if( rc
8960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
8970: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
8980: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 56 74  .  assert( *ppVt
8990: 61 62 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab==0 );.  asser
89a0: 74 28 20 70 52 74 72 65 65 2d 3e 6e 42 75 73 79  t( pRtree->nBusy
89b0: 3d 3d 31 20 29 3b 0a 20 20 72 74 72 65 65 52 65  ==1 );.  rtreeRe
89c0: 6c 65 61 73 65 28 70 52 74 72 65 65 29 3b 0a 20  lease(pRtree);. 
89d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
89e0: 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76  /* .** GEOPOLY v
89f0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
8a00: 75 6c 65 20 78 43 72 65 61 74 65 20 6d 65 74 68  ule xCreate meth
8a10: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
8a20: 74 20 67 65 6f 70 6f 6c 79 43 72 65 61 74 65 28  t geopolyCreate(
8a30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8a40: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
8a50: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
8a60: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
8a70: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
8a80: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
8a90: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
8aa0: 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69  eturn geopolyIni
8ab0: 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63  t(db, pAux, argc
8ac0: 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20  , argv, ppVtab, 
8ad0: 70 7a 45 72 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  pzErr, 1);.}../*
8ae0: 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69 72   .** GEOPOLY vir
8af0: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
8b00: 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  e xConnect metho
8b10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8b20: 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63 74 28   geopolyConnect(
8b30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8b40: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
8b50: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
8b60: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
8b70: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
8b80: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
8b90: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
8ba0: 65 74 75 72 6e 20 67 65 6f 70 6f 6c 79 49 6e 69  eturn geopolyIni
8bb0: 74 28 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63  t(db, pAux, argc
8bc0: 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20  , argv, ppVtab, 
8bd0: 70 7a 45 72 72 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  pzErr, 0);.}.../
8be0: 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59 20 76 69  * .** GEOPOLY vi
8bf0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
8c00: 6c 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  le xFilter metho
8c10: 64 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70  d..**.** Query p
8c20: 6c 61 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lans:.**.**     
8c30: 20 31 20 20 20 20 20 20 20 20 20 72 6f 77 69 64   1         rowid
8c40: 20 6c 6f 6f 6b 75 70 0a 2a 2a 20 20 20 20 20 20   lookup.**      
8c50: 32 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68  2         search
8c60: 20 66 6f 72 20 6f 62 6a 65 63 74 73 20 6f 76 65   for objects ove
8c70: 72 6c 61 70 70 69 6e 67 20 74 68 65 20 73 61 6d  rlapping the sam
8c80: 65 20 62 6f 75 6e 64 69 6e 67 20 62 6f 78 0a 2a  e bounding box.*
8c90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
8ca0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
8cb0: 6f 6c 79 67 6f 6e 20 61 72 67 76 5b 30 5d 0a 2a  olygon argv[0].*
8cc0: 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
8cd0: 20 73 65 61 72 63 68 20 66 6f 72 20 6f 62 6a 65   search for obje
8ce0: 63 74 73 20 6f 76 65 72 6c 61 70 70 69 6e 67 20  cts overlapping 
8cf0: 74 68 65 20 73 61 6d 65 20 62 6f 75 6e 64 69 6e  the same boundin
8d00: 67 20 62 6f 78 0a 2a 2a 20 20 20 20 20 20 20 20  g box.**        
8d10: 20 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e          that con
8d20: 74 61 69 6e 73 20 70 6f 6c 79 67 6f 6e 20 61 72  tains polygon ar
8d30: 67 76 5b 30 5d 0a 2a 2a 20 20 20 20 20 20 34 20  gv[0].**      4 
8d40: 20 20 20 20 20 20 20 20 66 75 6c 6c 20 74 61 62          full tab
8d50: 6c 65 20 73 63 61 6e 0a 2a 2f 0a 73 74 61 74 69  le scan.*/.stati
8d60: 63 20 69 6e 74 20 67 65 6f 70 6f 6c 79 46 69 6c  c int geopolyFil
8d70: 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
8d80: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
8d90: 62 43 75 72 73 6f 72 2c 20 20 20 20 20 2f 2a 20  bCursor,     /* 
8da0: 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 6e  The cursor to in
8db0: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e  itialize */.  in
8dc0: 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20  t idxNum,       
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 70 6c 61      /* Query pla
8df0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
8e00: 72 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20  r *idxStr,      
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e20: 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 20 20 69 6e  Not Used */.  in
8e30: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
8e40: 76 61 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 20  value **argv    
8e50: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
8e60: 73 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70  s to the query p
8e70: 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 52 74 72 65  lan */.){.  Rtre
8e80: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
8e90: 65 65 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72  ee *)pVtabCursor
8ea0: 2d 3e 70 56 74 61 62 3b 0a 20 20 52 74 72 65 65  ->pVtab;.  Rtree
8eb0: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
8ec0: 52 74 72 65 65 43 75 72 73 6f 72 20 2a 29 70 56  RtreeCursor *)pV
8ed0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 52 74 72  tabCursor;.  Rtr
8ee0: 65 65 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20  eeNode *pRoot = 
8ef0: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
8f00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
8f10: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Cell = 0;.  sqli
8f20: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8f30: 0a 0a 20 20 72 74 72 65 65 52 65 66 65 72 65 6e  ..  rtreeReferen
8f40: 63 65 28 70 52 74 72 65 65 29 3b 0a 0a 20 20 2f  ce(pRtree);..  /
8f50: 2a 20 52 65 73 65 74 20 74 68 65 20 63 75 72 73  * Reset the curs
8f60: 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  or to the same s
8f70: 74 61 74 65 20 61 73 20 72 74 72 65 65 4f 70 65  tate as rtreeOpe
8f80: 6e 28 29 20 6c 65 61 76 65 73 20 69 74 20 69 6e  n() leaves it in
8f90: 2e 20 2a 2f 0a 20 20 66 72 65 65 43 75 72 73 6f  . */.  freeCurso
8fa0: 72 43 6f 6e 73 74 72 61 69 6e 74 73 28 70 43 73  rConstraints(pCs
8fb0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
8fc0: 65 65 28 70 43 73 72 2d 3e 61 50 6f 69 6e 74 29  ee(pCsr->aPoint)
8fd0: 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 43 73 72  ;.  pStmt = pCsr
8fe0: 2d 3e 70 52 65 61 64 41 75 78 3b 0a 20 20 6d 65  ->pReadAux;.  me
8ff0: 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
9000: 7a 65 6f 66 28 52 74 72 65 65 43 75 72 73 6f 72  zeof(RtreeCursor
9010: 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62 61 73 65  ));.  pCsr->base
9020: 2e 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  .pVtab = (sqlite
9030: 33 5f 76 74 61 62 2a 29 70 52 74 72 65 65 3b 0a  3_vtab*)pRtree;.
9040: 20 20 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78    pCsr->pReadAux
9050: 20 3d 20 70 53 74 6d 74 3b 0a 0a 20 20 70 43 73   = pStmt;..  pCs
9060: 72 2d 3e 69 53 74 72 61 74 65 67 79 20 3d 20 69  r->iStrategy = i
9070: 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64 78  dxNum;.  if( idx
9080: 4e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  Num==1 ){.    /*
9090: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20   Special case - 
90a0: 6c 6f 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 2e  lookup by rowid.
90b0: 20 2a 2f 0a 20 20 20 20 52 74 72 65 65 4e 6f 64   */.    RtreeNod
90c0: 65 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  e *pLeaf;       
90d0: 20 2f 2a 20 4c 65 61 66 20 6f 6e 20 77 68 69 63   /* Leaf on whic
90e0: 68 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  h the required c
90f0: 65 6c 6c 20 72 65 73 69 64 65 73 20 2a 2f 0a 20  ell resides */. 
9100: 20 20 20 52 74 72 65 65 53 65 61 72 63 68 50 6f     RtreeSearchPo
9110: 69 6e 74 20 2a 70 3b 20 20 20 20 20 2f 2a 20 53  int *p;     /* S
9120: 65 61 72 63 68 20 70 6f 69 6e 74 20 66 6f 72 20  earch point for 
9130: 74 68 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  the leaf */.    
9140: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  i64 iRowid = sql
9150: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
9160: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
9170: 36 34 20 69 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  64 iNode = 0;.  
9180: 20 20 72 63 20 3d 20 66 69 6e 64 4c 65 61 66 4e    rc = findLeafN
9190: 6f 64 65 28 70 52 74 72 65 65 2c 20 69 52 6f 77  ode(pRtree, iRow
91a0: 69 64 2c 20 26 70 4c 65 61 66 2c 20 26 69 4e 6f  id, &pLeaf, &iNo
91b0: 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  de);.    if( rc=
91c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
91d0: 65 61 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf!=0 ){.      
91e0: 70 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50  p = rtreeSearchP
91f0: 6f 69 6e 74 4e 65 77 28 70 43 73 72 2c 20 52 54  ointNew(pCsr, RT
9200: 52 45 45 5f 5a 45 52 4f 2c 20 30 29 3b 0a 20 20  REE_ZERO, 0);.  
9210: 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
9220: 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 72   );  /* Always r
9230: 65 74 75 72 6e 73 20 70 43 73 72 2d 3e 73 50 6f  eturns pCsr->sPo
9240: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 43 73  int */.      pCs
9250: 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20 3d 20 70 4c  r->aNode[0] = pL
9260: 65 61 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 64  eaf;.      p->id
9270: 20 3d 20 69 4e 6f 64 65 3b 0a 20 20 20 20 20 20   = iNode;.      
9280: 70 2d 3e 65 57 69 74 68 69 6e 20 3d 20 50 41 52  p->eWithin = PAR
9290: 54 4c 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20  TLY_WITHIN;.    
92a0: 20 20 72 63 20 3d 20 6e 6f 64 65 52 6f 77 69 64    rc = nodeRowid
92b0: 49 6e 64 65 78 28 70 52 74 72 65 65 2c 20 70 4c  Index(pRtree, pL
92c0: 65 61 66 2c 20 69 52 6f 77 69 64 2c 20 26 69 43  eaf, iRowid, &iC
92d0: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ell);.      p->i
92e0: 43 65 6c 6c 20 3d 20 28 75 38 29 69 43 65 6c 6c  Cell = (u8)iCell
92f0: 3b 0a 20 20 20 20 20 20 52 54 52 45 45 5f 51 55  ;.      RTREE_QU
9300: 45 55 45 5f 54 52 41 43 45 28 70 43 73 72 2c 20  EUE_TRACE(pCsr, 
9310: 22 50 55 53 48 2d 46 31 3a 22 29 3b 0a 20 20 20  "PUSH-F1:");.   
9320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
9330: 73 72 2d 3e 61 74 45 4f 46 20 3d 20 31 3b 0a 20  sr->atEOF = 1;. 
9340: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9350: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73 65    /* Normal case
9360: 20 2d 20 72 2d 74 72 65 65 20 73 63 61 6e 2e 20   - r-tree scan. 
9370: 53 65 74 20 75 70 20 74 68 65 20 52 74 72 65 65  Set up the Rtree
9380: 43 75 72 73 6f 72 2e 61 43 6f 6e 73 74 72 61 69  Cursor.aConstrai
9390: 6e 74 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a  nt array .    **
93a0: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 66 69 67   with the config
93b0: 75 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  ured constraints
93c0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  . .    */.    rc
93d0: 20 3d 20 6e 6f 64 65 41 63 71 75 69 72 65 28 70   = nodeAcquire(p
93e0: 52 74 72 65 65 2c 20 31 2c 20 30 2c 20 26 70 52  Rtree, 1, 0, &pR
93f0: 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
9400: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9410: 64 78 4e 75 6d 3c 3d 33 20 29 7b 0a 20 20 20 20  dxNum<=3 ){.    
9420: 20 20 52 74 72 65 65 43 6f 6f 72 64 20 62 62 6f    RtreeCoord bbo
9430: 78 5b 34 5d 3b 0a 20 20 20 20 20 20 52 74 72 65  x[4];.      Rtre
9440: 65 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 3b 0a  eConstraint *p;.
9450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 72        assert( ar
9460: 67 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 67  gc==1 );.      g
9470: 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61 72  eopolyBBox(0, ar
9480: 67 76 5b 30 5d 2c 20 62 62 6f 78 2c 20 26 72 63  gv[0], bbox, &rc
9490: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
94b0: 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f 65  geopoly_filter_e
94c0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
94d0: 20 20 70 43 73 72 2d 3e 61 43 6f 6e 73 74 72 61    pCsr->aConstra
94e0: 69 6e 74 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  int = p = sqlite
94f0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
9500: 52 74 72 65 65 43 6f 6e 73 74 72 61 69 6e 74 29  RtreeConstraint)
9510: 2a 34 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d  *4);.      pCsr-
9520: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 34  >nConstraint = 4
9530: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3d 3d 30  ;.      if( p==0
9540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9550: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9560: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9570: 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d      memset(pCsr-
9580: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 2c 20 30 2c  >aConstraint, 0,
9590: 20 73 69 7a 65 6f 66 28 52 74 72 65 65 43 6f 6e   sizeof(RtreeCon
95a0: 73 74 72 61 69 6e 74 29 2a 34 29 3b 0a 20 20 20  straint)*4);.   
95b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72       memset(pCsr
95c0: 2d 3e 61 6e 51 75 65 75 65 2c 20 30 2c 20 73 69  ->anQueue, 0, si
95d0: 7a 65 6f 66 28 75 33 32 29 2a 28 70 52 74 72 65  zeof(u32)*(pRtre
95e0: 65 2d 3e 69 44 65 70 74 68 20 2b 20 31 29 29 3b  e->iDepth + 1));
95f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
9600: 4e 75 6d 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Num==2 ){.      
9610: 20 20 20 20 2f 2a 20 4f 76 65 72 6c 61 70 20 71      /* Overlap q
9620: 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  uery */.        
9630: 20 20 70 2d 3e 6f 70 20 3d 20 27 42 27 3b 0a 20    p->op = 'B';. 
9640: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f           p->iCoo
9650: 72 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rd = 0;.        
9660: 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20 3d 20    p->u.rValue = 
9670: 62 62 6f 78 5b 31 5d 2e 66 3b 0a 20 20 20 20 20  bbox[1].f;.     
9680: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20       p++;.      
9690: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 44 27 3b      p->op = 'D';
96a0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 43  .          p->iC
96b0: 6f 6f 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oord = 1;.      
96c0: 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75 65 20      p->u.rValue 
96d0: 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b 0a 20 20 20  = bbox[0].f;.   
96e0: 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20         p++;.    
96f0: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27 42        p->op = 'B
9700: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ';.          p->
9710: 69 43 6f 6f 72 64 20 3d 20 32 3b 0a 20 20 20 20  iCoord = 2;.    
9720: 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c 75        p->u.rValu
9730: 65 20 3d 20 62 62 6f 78 5b 33 5d 2e 66 3b 0a 20  e = bbox[3].f;. 
9740: 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20           p++;.  
9750: 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20          p->op = 
9760: 27 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70  'D';.          p
9770: 2d 3e 69 43 6f 6f 72 64 20 3d 20 33 3b 0a 20 20  ->iCoord = 3;.  
9780: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61          p->u.rVa
9790: 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d 2e 66 3b  lue = bbox[2].f;
97a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
97b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74            /* Wit
97c0: 68 69 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  hin query */.   
97d0: 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 27         p->op = '
97e0: 44 27 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  D';.          p-
97f0: 3e 69 43 6f 6f 72 64 20 3d 20 30 3b 0a 20 20 20  >iCoord = 0;.   
9800: 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56 61 6c         p->u.rVal
9810: 75 65 20 3d 20 62 62 6f 78 5b 30 5d 2e 66 3b 0a  ue = bbox[0].f;.
9820: 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20            p++;. 
9830: 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d           p->op =
9840: 20 27 42 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'B';.          
9850: 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 31 3b 0a 20  p->iCoord = 1;. 
9860: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 72 56           p->u.rV
9870: 61 6c 75 65 20 3d 20 62 62 6f 78 5b 31 5d 2e 66  alue = bbox[1].f
9880: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b  ;.          p++;
9890: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  .          p->op
98a0: 20 3d 20 27 44 27 3b 0a 20 20 20 20 20 20 20 20   = 'D';.        
98b0: 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20 32 3b    p->iCoord = 2;
98c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e  .          p->u.
98d0: 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b 32 5d  rValue = bbox[2]
98e0: 2e 66 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2b  .f;.          p+
98f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  +;.          p->
9900: 6f 70 20 3d 20 27 42 27 3b 0a 20 20 20 20 20 20  op = 'B';.      
9910: 20 20 20 20 70 2d 3e 69 43 6f 6f 72 64 20 3d 20      p->iCoord = 
9920: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  3;.          p->
9930: 75 2e 72 56 61 6c 75 65 20 3d 20 62 62 6f 78 5b  u.rValue = bbox[
9940: 33 5d 2e 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a  3].f;.        }.
9950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9960: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9970: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 52 74 72  _OK ){.      Rtr
9980: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
9990: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  New;.      pNew 
99a0: 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f 69  = rtreeSearchPoi
99b0: 6e 74 4e 65 77 28 70 43 73 72 2c 20 52 54 52 45  ntNew(pCsr, RTRE
99c0: 45 5f 5a 45 52 4f 2c 20 28 75 38 29 28 70 52 74  E_ZERO, (u8)(pRt
99d0: 72 65 65 2d 3e 69 44 65 70 74 68 2b 31 29 29 3b  ree->iDepth+1));
99e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
99f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
9a00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9a10: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 67 65  .        goto ge
9a20: 6f 70 6f 6c 79 5f 66 69 6c 74 65 72 5f 65 6e 64  opoly_filter_end
9a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9a40: 70 4e 65 77 2d 3e 69 64 20 3d 20 31 3b 0a 20 20  pNew->id = 1;.  
9a50: 20 20 20 20 70 4e 65 77 2d 3e 69 43 65 6c 6c 20      pNew->iCell 
9a60: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
9a70: 3e 65 57 69 74 68 69 6e 20 3d 20 50 41 52 54 4c  >eWithin = PARTL
9a80: 59 5f 57 49 54 48 49 4e 3b 0a 20 20 20 20 20 20  Y_WITHIN;.      
9a90: 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62 50  assert( pCsr->bP
9aa0: 6f 69 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  oint==1 );.     
9ab0: 20 70 43 73 72 2d 3e 61 4e 6f 64 65 5b 30 5d 20   pCsr->aNode[0] 
9ac0: 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70  = pRoot;.      p
9ad0: 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Root = 0;.      
9ae0: 52 54 52 45 45 5f 51 55 45 55 45 5f 54 52 41 43  RTREE_QUEUE_TRAC
9af0: 45 28 70 43 73 72 2c 20 22 50 55 53 48 2d 46 6d  E(pCsr, "PUSH-Fm
9b00: 3a 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  :");.      rc = 
9b10: 72 74 72 65 65 53 74 65 70 54 6f 4c 65 61 66 28  rtreeStepToLeaf(
9b20: 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCsr);.    }.  }
9b30: 0a 0a 67 65 6f 70 6f 6c 79 5f 66 69 6c 74 65 72  ..geopoly_filter
9b40: 5f 65 6e 64 3a 0a 20 20 6e 6f 64 65 52 65 6c 65  _end:.  nodeRele
9b50: 61 73 65 28 70 52 74 72 65 65 2c 20 70 52 6f 6f  ase(pRtree, pRoo
9b60: 74 29 3b 0a 20 20 72 74 72 65 65 52 65 6c 65 61  t);.  rtreeRelea
9b70: 73 65 28 70 52 74 72 65 65 29 3b 0a 20 20 72 65  se(pRtree);.  re
9b80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9b90: 2a 20 52 74 72 65 65 20 76 69 72 74 75 61 6c 20  * Rtree virtual 
9ba0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 42 65  table module xBe
9bb0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20  stIndex method. 
9bc0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 0a  There are three.
9bd0: 2a 2a 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  ** table scan st
9be0: 72 61 74 65 67 69 65 73 20 74 6f 20 63 68 6f 6f  rategies to choo
9bf0: 73 65 20 66 72 6f 6d 20 28 69 6e 20 6f 72 64 65  se from (in orde
9c00: 72 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 0a  r from most to .
9c10: 2a 2a 20 6c 65 61 73 74 20 64 65 73 69 72 61 62  ** least desirab
9c20: 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 64 78  le):.**.**   idx
9c30: 4e 75 6d 20 20 20 20 20 69 64 78 53 74 72 20 20  Num     idxStr  
9c40: 20 20 20 20 20 20 53 74 72 61 74 65 67 79 0a 2a        Strategy.*
9c50: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
9c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c80: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 31 20 20 20  ----.**     1   
9c90: 20 20 20 20 20 22 72 6f 77 69 64 22 20 20 20 20       "rowid"    
9ca0: 20 20 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70     Direct lookup
9cb0: 20 62 79 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20   by rowid..**   
9cc0: 20 20 32 20 20 20 20 20 20 20 20 22 72 74 72 65    2        "rtre
9cd0: 65 22 20 20 20 20 20 20 20 52 2d 74 72 65 65 20  e"       R-tree 
9ce0: 6f 76 65 72 6c 61 70 20 71 75 65 72 79 20 75 73  overlap query us
9cf0: 69 6e 67 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72  ing geopoly_over
9d00: 6c 61 70 28 29 0a 2a 2a 20 20 20 20 20 33 20 20  lap().**     3  
9d10: 20 20 20 20 20 20 22 72 74 72 65 65 22 20 20 20        "rtree"   
9d20: 20 20 20 20 52 2d 74 72 65 65 20 77 69 74 68 69      R-tree withi
9d30: 6e 20 71 75 65 72 79 20 75 73 69 6e 67 20 67 65  n query using ge
9d40: 6f 70 6f 6c 79 5f 77 69 74 68 69 6e 28 29 0a 2a  opoly_within().*
9d50: 2a 20 20 20 20 20 34 20 20 20 20 20 20 20 20 22  *     4        "
9d60: 66 75 6c 6c 73 63 61 6e 22 20 20 20 20 66 75 6c  fullscan"    ful
9d70: 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2a  l-table scan..**
9d80: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9db0: 2d 2d 2d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ---.*/.static in
9dc0: 74 20 67 65 6f 70 6f 6c 79 42 65 73 74 49 6e 64  t geopolyBestInd
9dd0: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
9de0: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
9df0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
9e00: 66 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  fo){.  int ii;. 
9e10: 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72 6d 20   int iRowidTerm 
9e20: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 46 75 6e  = -1;.  int iFun
9e30: 63 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e  cTerm = -1;.  in
9e40: 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 0a 20  t idxNum = 0;.. 
9e50: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49   for(ii=0; ii<pI
9e60: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
9e70: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
9e80: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
9e90: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
9ea0: 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e  *p = &pIdxInfo->
9eb0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 69 5d 3b  aConstraint[ii];
9ec0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 61  .    if( !p->usa
9ed0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
9ee0: 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c 75      if( p->iColu
9ef0: 6d 6e 3c 30 20 26 26 20 70 2d 3e 6f 70 3d 3d 53  mn<0 && p->op==S
9f00: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
9f10: 54 52 41 49 4e 54 5f 45 51 20 20 29 7b 0a 20 20  TRAINT_EQ  ){.  
9f20: 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20 3d      iRowidTerm =
9f30: 20 69 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   ii;.      break
9f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9f50: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  p->iColumn==0 &&
9f60: 20 70 2d 3e 6f 70 3e 3d 53 51 4c 49 54 45 5f 49   p->op>=SQLITE_I
9f70: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
9f80: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
9f90: 20 20 2f 2a 20 70 2d 3e 6f 70 3d 3d 53 51 4c 49    /* p->op==SQLI
9fa0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
9fb0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 20 66 6f 72  INT_FUNCTION for
9fc0: 20 67 65 6f 70 6f 6c 79 5f 6f 76 65 72 6c 61 70   geopoly_overlap
9fd0: 28 29 0a 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6f  ().      ** p->o
9fe0: 70 3d 3d 28 53 51 4c 49 54 45 5f 49 4e 44 45 58  p==(SQLITE_INDEX
9ff0: 5f 43 4f 4e 54 52 41 49 4e 54 5f 46 55 4e 43 54  _CONTRAINT_FUNCT
a000: 49 4f 4e 2b 31 29 20 66 6f 72 20 67 65 6f 70 6f  ION+1) for geopo
a010: 6c 79 5f 77 69 74 68 69 6e 28 29 2e 0a 20 20 20  ly_within()..   
a020: 20 20 20 2a 2a 20 53 65 65 20 67 65 6f 70 6f 6c     ** See geopol
a030: 79 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 29 20  yFindFunction() 
a040: 2a 2f 0a 20 20 20 20 20 20 69 46 75 6e 63 54 65  */.      iFuncTe
a050: 72 6d 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 69  rm = ii;.      i
a060: 64 78 4e 75 6d 20 3d 20 70 2d 3e 6f 70 20 2d 20  dxNum = p->op - 
a070: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
a080: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
a090: 20 2b 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 2;.    }.  }.
a0a0: 0a 20 20 69 66 28 20 69 52 6f 77 69 64 54 65 72  .  if( iRowidTer
a0b0: 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78  m>=0 ){.    pIdx
a0c0: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31  Info->idxNum = 1
a0d0: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
a0e0: 69 64 78 53 74 72 20 3d 20 22 72 6f 77 69 64 22  idxStr = "rowid"
a0f0: 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
a100: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
a110: 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 61 72 67  [iRowidTerm].arg
a120: 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  vIndex = 1;.    
a130: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
a140: 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f 77 69  raintUsage[iRowi
a150: 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b  dTerm].omit = 1;
a160: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
a170: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 33  stimatedCost = 3
a180: 30 2e 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  0.0;.    pIdxInf
a190: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
a1a0: 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 1;.    pIdxIn
a1b0: 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 53  fo->idxFlags = S
a1c0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
a1d0: 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 72 65 74  _UNIQUE;.    ret
a1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a1f0: 20 7d 0a 20 20 69 66 28 20 69 46 75 6e 63 54 65   }.  if( iFuncTe
a200: 72 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64  rm>=0 ){.    pId
a210: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
a220: 69 64 78 4e 75 6d 3b 0a 20 20 20 20 70 49 64 78  idxNum;.    pIdx
a230: 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22  Info->idxStr = "
a240: 72 74 72 65 65 22 3b 0a 20 20 20 20 70 49 64 78  rtree";.    pIdx
a250: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
a260: 74 55 73 61 67 65 5b 69 46 75 6e 63 54 65 72 6d  tUsage[iFuncTerm
a270: 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
a280: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
a290: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
a2a0: 69 46 75 6e 63 54 65 72 6d 5d 2e 6f 6d 69 74 20  iFuncTerm].omit 
a2b0: 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
a2c0: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
a2d0: 20 3d 20 33 30 30 2e 30 3b 0a 20 20 20 20 70 49   = 300.0;.    pI
a2e0: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
a2f0: 64 52 6f 77 73 20 3d 20 31 30 3b 0a 20 20 20 20  dRows = 10;.    
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 7d 0a 20 20 70 49 64 78 49 6e 66 6f  ;.  }.  pIdxInfo
a320: 2d 3e 69 64 78 4e 75 6d 20 3d 20 34 3b 0a 20 20  ->idxNum = 4;.  
a330: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
a340: 20 3d 20 22 66 75 6c 6c 73 63 61 6e 22 3b 0a 20   = "fullscan";. 
a350: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
a360: 61 74 65 64 43 6f 73 74 20 3d 20 33 30 30 30 30  atedCost = 30000
a370: 30 30 2e 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f  00.0;.  pIdxInfo
a380: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
a390: 3d 20 31 30 30 30 30 30 3b 0a 20 20 72 65 74 75  = 100000;.  retu
a3a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a3b0: 0a 0a 2f 2a 20 0a 2a 2a 20 47 45 4f 50 4f 4c 59  ../* .** GEOPOLY
a3c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
a3d0: 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  odule xColumn me
a3e0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
a3f0: 69 6e 74 20 67 65 6f 70 6f 6c 79 43 6f 6c 75 6d  int geopolyColum
a400: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  n(sqlite3_vtab_c
a410: 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69  ursor *cur, sqli
a420: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
a430: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 52 74 72 65  , int i){.  Rtre
a440: 65 20 2a 70 52 74 72 65 65 20 3d 20 28 52 74 72  e *pRtree = (Rtr
a450: 65 65 20 2a 29 63 75 72 2d 3e 70 56 74 61 62 3b  ee *)cur->pVtab;
a460: 0a 20 20 52 74 72 65 65 43 75 72 73 6f 72 20 2a  .  RtreeCursor *
a470: 70 43 73 72 20 3d 20 28 52 74 72 65 65 43 75 72  pCsr = (RtreeCur
a480: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 52 74 72  sor *)cur;.  Rtr
a490: 65 65 53 65 61 72 63 68 50 6f 69 6e 74 20 2a 70  eeSearchPoint *p
a4a0: 20 3d 20 72 74 72 65 65 53 65 61 72 63 68 50 6f   = rtreeSearchPo
a4b0: 69 6e 74 46 69 72 73 74 28 70 43 73 72 29 3b 0a  intFirst(pCsr);.
a4c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a4d0: 45 5f 4f 4b 3b 0a 20 20 52 74 72 65 65 4e 6f 64  E_OK;.  RtreeNod
a4e0: 65 20 2a 70 4e 6f 64 65 20 3d 20 72 74 72 65 65  e *pNode = rtree
a4f0: 4e 6f 64 65 4f 66 46 69 72 73 74 53 65 61 72 63  NodeOfFirstSearc
a500: 68 50 6f 69 6e 74 28 70 43 73 72 2c 20 26 72 63  hPoint(pCsr, &rc
a510: 29 3b 0a 0a 20 20 69 66 28 20 72 63 20 29 20 72  );..  if( rc ) r
a520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
a530: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
a540: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
a550: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f 76  ==0 && sqlite3_v
a560: 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 63 74 78  tab_nochange(ctx
a570: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
a580: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 3c 3d 70  E_OK;.  if( i<=p
a590: 52 74 72 65 65 2d 3e 6e 41 75 78 20 29 7b 0a 20  Rtree->nAux ){. 
a5a0: 20 20 20 69 66 28 20 21 70 43 73 72 2d 3e 62 41     if( !pCsr->bA
a5b0: 75 78 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  uxValid ){.     
a5c0: 20 69 66 28 20 70 43 73 72 2d 3e 70 52 65 61 64   if( pCsr->pRead
a5d0: 41 75 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Aux==0 ){.      
a5e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
a5f0: 72 65 70 61 72 65 5f 76 33 28 70 52 74 72 65 65  repare_v3(pRtree
a600: 2d 3e 64 62 2c 20 70 52 74 72 65 65 2d 3e 7a 52  ->db, pRtree->zR
a610: 65 61 64 41 75 78 53 71 6c 2c 20 2d 31 2c 20 30  eadAuxSql, -1, 0
a620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 26 70 43 73 72 2d 3e 70 52 65 61 64 41 75    &pCsr->pReadAu
a650: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  x, 0);.        i
a660: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a670: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
a680: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a690: 74 36 34 28 70 43 73 72 2d 3e 70 52 65 61 64 41  t64(pCsr->pReadA
a6a0: 75 78 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20  ux, 1, .        
a6b0: 20 20 6e 6f 64 65 47 65 74 52 6f 77 69 64 28 70    nodeGetRowid(p
a6c0: 52 74 72 65 65 2c 20 70 4e 6f 64 65 2c 20 70 2d  Rtree, pNode, p-
a6d0: 3e 69 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20  >iCell));.      
a6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
a6f0: 70 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  p(pCsr->pReadAux
a700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
a710: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
a720: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 62 41 75         pCsr->bAu
a730: 78 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  xValid = 1;.    
a740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a750: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
a760: 43 73 72 2d 3e 70 52 65 61 64 41 75 78 29 3b 0a  Csr->pReadAux);.
a770: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
a780: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
a790: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a7a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a7b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a7c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a7d0: 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
a7e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
a7f0: 65 28 70 43 73 72 2d 3e 70 52 65 61 64 41 75 78  e(pCsr->pReadAux
a800: 2c 20 69 2b 32 29 29 3b 0a 20 20 7d 0a 20 20 72  , i+2));.  }.  r
a810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a820: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  .}.../*.** The x
a830: 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 66 6f  Update method fo
a840: 72 20 47 45 4f 50 4f 4c 59 20 6d 6f 64 75 6c 65  r GEOPOLY module
a850: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
a860: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 44 45 4c 45 54  .**.** For DELET
a870: 45 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67  E:.**.**     arg
a880: 76 5b 30 5d 20 3d 20 74 68 65 20 72 6f 77 69 64  v[0] = the rowid
a890: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 0a 2a   to be deleted.*
a8a0: 2a 0a 2a 2a 20 46 6f 72 20 49 4e 53 45 52 54 3a  *.** For INSERT:
a8b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  .**.**     argv[
a8c0: 30 5d 20 3d 20 53 51 4c 20 4e 55 4c 4c 0a 2a 2a  0] = SQL NULL.**
a8d0: 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72       argv[1] = r
a8e0: 6f 77 69 64 20 74 6f 20 69 6e 73 65 72 74 2c 20  owid to insert, 
a8f0: 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 74  or an SQL NULL t
a900: 6f 20 73 65 6c 65 63 74 20 61 75 74 6f 6d 61 74  o select automat
a910: 69 63 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 61 72  ically.**     ar
a920: 67 76 5b 32 5d 20 3d 20 5f 73 68 61 70 65 20 63  gv[2] = _shape c
a930: 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 61 72 67  olumn.**     arg
a940: 76 5b 33 5d 20 3d 20 66 69 72 73 74 20 61 70 70  v[3] = first app
a950: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
a960: 20 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2a 0a 2a   column.....**.*
a970: 2a 20 46 6f 72 20 55 50 44 41 54 45 3a 0a 2a 2a  * For UPDATE:.**
a980: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20  .**     argv[0] 
a990: 3d 20 72 6f 77 69 64 20 74 6f 20 6d 6f 64 69 66  = rowid to modif
a9a0: 79 2e 20 20 4e 65 76 65 72 20 4e 55 4c 4c 0a 2a  y.  Never NULL.*
a9b0: 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20  *     argv[1] = 
a9c0: 72 6f 77 69 64 20 61 66 74 65 72 20 74 68 65 20  rowid after the 
a9d0: 63 68 61 6e 67 65 2e 20 20 4e 65 76 65 72 20 4e  change.  Never N
a9e0: 55 4c 4c 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  ULL.**     argv[
a9f0: 32 5d 20 3d 20 6e 65 77 20 76 61 6c 75 65 20 66  2] = new value f
aa00: 6f 72 20 5f 73 68 61 70 65 0a 2a 2a 20 20 20 20  or _shape.**    
aa10: 20 61 72 67 76 5b 33 5d 20 3d 20 6e 65 77 20 76   argv[3] = new v
aa20: 61 6c 75 65 20 66 6f 72 20 66 69 72 73 74 20 61  alue for first a
aa30: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
aa40: 65 64 20 63 6f 6c 75 6d 6e 2e 2e 2e 2e 0a 2a 2f  ed column.....*/
aa50: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6f 70  .static int geop
aa60: 6f 6c 79 55 70 64 61 74 65 28 0a 20 20 73 71 6c  olyUpdate(.  sql
aa70: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
aa80: 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  , .  int nData, 
aa90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
aaa0: 20 2a 2a 61 44 61 74 61 2c 20 0a 20 20 73 71 6c   **aData, .  sql
aab0: 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
aac0: 64 0a 29 7b 0a 20 20 52 74 72 65 65 20 2a 70 52  d.){.  Rtree *pR
aad0: 74 72 65 65 20 3d 20 28 52 74 72 65 65 20 2a 29  tree = (Rtree *)
aae0: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
aaf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 52  = SQLITE_OK;.  R
ab00: 74 72 65 65 43 65 6c 6c 20 63 65 6c 6c 3b 20 20  treeCell cell;  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab20: 2a 20 4e 65 77 20 63 65 6c 6c 20 74 6f 20 69 6e  * New cell to in
ab30: 73 65 72 74 20 69 66 20 6e 44 61 74 61 3e 31 20  sert if nData>1 
ab40: 2a 2f 0a 20 20 69 36 34 20 6f 6c 64 52 6f 77 69  */.  i64 oldRowi
ab50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
ab60: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20       /* The old 
ab70: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  rowid */.  int o
ab80: 6c 64 52 6f 77 69 64 56 61 6c 69 64 3b 20 20 20  ldRowidValid;   
ab90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aba0: 75 65 20 69 66 20 6f 6c 64 52 6f 77 69 64 20 69  ue if oldRowid i
abb0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
abc0: 20 6e 65 77 52 6f 77 69 64 3b 20 20 20 20 20 20   newRowid;      
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
abe0: 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f  The new rowid */
abf0: 0a 20 20 69 6e 74 20 6e 65 77 52 6f 77 69 64 56  .  int newRowidV
ac00: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
ac10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
ac20: 77 52 6f 77 69 64 20 69 73 20 76 61 6c 69 64 20  wRowid is valid 
ac30: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6f 72 64 43 68  */.  int coordCh
ac40: 61 6e 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  ange = 0;       
ac50: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69       /* Change i
ac60: 6e 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 2a 2f  n coordinates */
ac70: 0a 0a 20 20 69 66 28 20 70 52 74 72 65 65 2d 3e  ..  if( pRtree->
ac80: 6e 4e 6f 64 65 52 65 66 20 29 7b 0a 20 20 20 20  nNodeRef ){.    
ac90: 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 77 72 69  /* Unable to wri
aca0: 74 65 20 74 6f 20 74 68 65 20 62 74 72 65 65 20  te to the btree 
acb0: 77 68 69 6c 65 20 61 6e 6f 74 68 65 72 20 63 75  while another cu
acc0: 72 73 6f 72 20 69 73 20 72 65 61 64 69 6e 67 20  rsor is reading 
acd0: 66 72 6f 6d 20 69 74 2c 0a 20 20 20 20 2a 2a 20  from it,.    ** 
ace0: 73 69 6e 63 65 20 74 68 65 20 77 72 69 74 65 20  since the write 
acf0: 6d 69 67 68 74 20 64 6f 20 61 20 72 65 62 61 6c  might do a rebal
ad00: 61 6e 63 65 20 77 68 69 63 68 20 77 6f 75 6c 64  ance which would
ad10: 20 64 69 73 72 75 70 74 20 74 68 65 20 72 65 61   disrupt the rea
ad20: 64 0a 20 20 20 20 2a 2a 20 63 75 72 73 6f 72 2e  d.    ** cursor.
ad30: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
ad40: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 56 54 41  QLITE_LOCKED_VTA
ad50: 42 3b 0a 20 20 7d 0a 20 20 72 74 72 65 65 52 65  B;.  }.  rtreeRe
ad60: 66 65 72 65 6e 63 65 28 70 52 74 72 65 65 29 3b  ference(pRtree);
ad70: 0a 20 20 61 73 73 65 72 74 28 6e 44 61 74 61 3e  .  assert(nData>
ad80: 3d 31 29 3b 0a 0a 20 20 6f 6c 64 52 6f 77 69 64  =1);..  oldRowid
ad90: 56 61 6c 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Valid = sqlite3_
ada0: 76 61 6c 75 65 5f 74 79 70 65 28 61 44 61 74 61  value_type(aData
adb0: 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])!=SQLITE_NUL
adc0: 4c 3b 3b 0a 20 20 6f 6c 64 52 6f 77 69 64 20 3d  L;;.  oldRowid =
add0: 20 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 3f   oldRowidValid ?
ade0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
adf0: 6e 74 36 34 28 61 44 61 74 61 5b 30 5d 29 20 3a  nt64(aData[0]) :
ae00: 20 30 3b 0a 20 20 6e 65 77 52 6f 77 69 64 56 61   0;.  newRowidVa
ae10: 6c 69 64 20 3d 20 6e 44 61 74 61 3e 31 20 26 26  lid = nData>1 &&
ae20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
ae30: 79 70 65 28 61 44 61 74 61 5b 31 5d 29 21 3d 53  ype(aData[1])!=S
ae40: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 6e 65  QLITE_NULL;.  ne
ae50: 77 52 6f 77 69 64 20 3d 20 6e 65 77 52 6f 77 69  wRowid = newRowi
ae60: 64 56 61 6c 69 64 20 3f 20 73 71 6c 69 74 65 33  dValid ? sqlite3
ae70: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44 61  _value_int64(aDa
ae80: 74 61 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 63 65  ta[1]) : 0;.  ce
ae90: 6c 6c 2e 69 52 6f 77 69 64 20 3d 20 6e 65 77 52  ll.iRowid = newR
aea0: 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 6e 44 61  owid;..  if( nDa
aeb0: 74 61 3e 31 20 20 20 20 20 20 20 20 20 20 20 20  ta>1            
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 2f 2a 20 6e 6f 74 20 61 20 44 45       /* not a DE
aee0: 4c 45 54 45 20 2a 2f 0a 20 20 20 26 26 20 28 21  LETE */.   && (!
aef0: 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 20 20 20  oldRowidValid   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 2f 2a 20 49 4e 53 45 52 54 20        /* INSERT 
af20: 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c 20 21 73  */.        || !s
af30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63  qlite3_value_noc
af40: 68 61 6e 67 65 28 61 44 61 74 61 5b 32 5d 29 20  hange(aData[2]) 
af50: 20 2f 2a 20 55 50 44 41 54 45 20 5f 73 68 61 70   /* UPDATE _shap
af60: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7c 7c 20  e */.        || 
af70: 6f 6c 64 52 6f 77 69 64 21 3d 6e 65 77 52 6f 77  oldRowid!=newRow
af80: 69 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20  id)             
af90: 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 68 61 6e     /* Rowid chan
afa0: 67 65 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 67  ge */.  ){.    g
afb0: 65 6f 70 6f 6c 79 42 42 6f 78 28 30 2c 20 61 44  eopolyBBox(0, aD
afc0: 61 74 61 5b 32 5d 2c 20 63 65 6c 6c 2e 61 43 6f  ata[2], cell.aCo
afd0: 6f 72 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  ord, &rc);.    i
afe0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
aff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
b000: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ROR ){.        p
b010: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 0a  Vtab->zErrMsg =.
b020: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b030: 33 5f 6d 70 72 69 6e 74 66 28 22 5f 73 68 61 70  3_mprintf("_shap
b040: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
b050: 69 6e 20 61 20 76 61 6c 69 64 20 70 6f 6c 79 67  in a valid polyg
b060: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  on");.      }.  
b070: 20 20 20 20 67 6f 74 6f 20 67 65 6f 70 6f 6c 79      goto geopoly
b080: 5f 75 70 64 61 74 65 5f 65 6e 64 3b 0a 20 20 20  _update_end;.   
b090: 20 7d 0a 20 20 20 20 63 6f 6f 72 64 43 68 61 6e   }.    coordChan
b0a0: 67 65 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 1;..    /* 
b0b0: 49 66 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65  If a rowid value
b0c0: 20 77 61 73 20 73 75 70 70 6c 69 65 64 2c 20 63   was supplied, c
b0d0: 68 65 63 6b 20 69 66 20 69 74 20 69 73 20 61 6c  heck if it is al
b0e0: 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e  ready present in
b0f0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62   .    ** the tab
b100: 6c 65 2e 20 49 66 20 73 6f 2c 20 74 68 65 20 63  le. If so, the c
b110: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 20 66 61  onstraint has fa
b120: 69 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  iled. */.    if(
b130: 20 6e 65 77 52 6f 77 69 64 56 61 6c 69 64 20 26   newRowidValid &
b140: 26 20 28 21 6f 6c 64 52 6f 77 69 64 56 61 6c 69  & (!oldRowidVali
b150: 64 20 7c 7c 20 6f 6c 64 52 6f 77 69 64 21 3d 6e  d || oldRowid!=n
b160: 65 77 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  ewRowid) ){.    
b170: 20 20 69 6e 74 20 73 74 65 70 72 63 3b 0a 20 20    int steprc;.  
b180: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
b190: 5f 69 6e 74 36 34 28 70 52 74 72 65 65 2d 3e 70  _int64(pRtree->p
b1a0: 52 65 61 64 52 6f 77 69 64 2c 20 31 2c 20 63 65  ReadRowid, 1, ce
b1b0: 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  ll.iRowid);.    
b1c0: 20 20 73 74 65 70 72 63 20 3d 20 73 71 6c 69 74    steprc = sqlit
b1d0: 65 33 5f 73 74 65 70 28 70 52 74 72 65 65 2d 3e  e3_step(pRtree->
b1e0: 70 52 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 20  pReadRowid);.   
b1f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
b200: 72 65 73 65 74 28 70 52 74 72 65 65 2d 3e 70 52  reset(pRtree->pR
b210: 65 61 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eadRowid);.     
b220: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
b230: 3d 73 74 65 70 72 63 20 29 7b 0a 20 20 20 20 20  =steprc ){.     
b240: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
b250: 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28  tab_on_conflict(
b260: 70 52 74 72 65 65 2d 3e 64 62 29 3d 3d 53 51 4c  pRtree->db)==SQL
b270: 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20  ITE_REPLACE ){. 
b280: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 74           rc = rt
b290: 72 65 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70  reeDeleteRowid(p
b2a0: 52 74 72 65 65 2c 20 63 65 6c 6c 2e 69 52 6f 77  Rtree, cell.iRow
b2b0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id);.        }el
b2c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
b2d0: 20 3d 20 72 74 72 65 65 43 6f 6e 73 74 72 61 69   = rtreeConstrai
b2e0: 6e 74 45 72 72 6f 72 28 70 52 74 72 65 65 2c 20  ntError(pRtree, 
b2f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
b300: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b310: 0a 20 20 2f 2a 20 49 66 20 61 44 61 74 61 5b 30  .  /* If aData[0
b320: 5d 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  ] is not an SQL 
b330: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 69 74 20 69  NULL value, it i
b340: 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
b350: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 6f 20  .  ** record to 
b360: 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 68 65 20  delete from the 
b370: 72 2d 74 72 65 65 20 74 61 62 6c 65 2e 20 54 68  r-tree table. Th
b380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
b390: 6b 20 64 6f 65 73 0a 20 20 2a 2a 20 6a 75 73 74  k does.  ** just
b3a0: 20 74 68 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   that..  */.  if
b3b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b3c0: 26 26 20 28 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  && (nData==1 || 
b3d0: 28 63 6f 6f 72 64 43 68 61 6e 67 65 20 26 26 20  (coordChange && 
b3e0: 6f 6c 64 52 6f 77 69 64 56 61 6c 69 64 29 29 20  oldRowidValid)) 
b3f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 74 72 65  ){.    rc = rtre
b400: 65 44 65 6c 65 74 65 52 6f 77 69 64 28 70 52 74  eDeleteRowid(pRt
b410: 72 65 65 2c 20 6f 6c 64 52 6f 77 69 64 29 3b 0a  ree, oldRowid);.
b420: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
b430: 20 61 44 61 74 61 5b 5d 20 61 72 72 61 79 20 63   aData[] array c
b440: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
b450: 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 2c 20 65  n one element, e
b460: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 28 61 44  lements.  ** (aD
b470: 61 74 61 5b 32 5d 2e 2e 61 44 61 74 61 5b 61 72  ata[2]..aData[ar
b480: 67 63 2d 31 5d 29 20 63 6f 6e 74 61 69 6e 20 61  gc-1]) contain a
b490: 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20 69   new record to i
b4a0: 6e 73 65 72 74 20 69 6e 74 6f 0a 20 20 2a 2a 20  nsert into.  ** 
b4b0: 74 68 65 20 72 2d 74 72 65 65 20 73 74 72 75 63  the r-tree struc
b4c0: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ture..  */.  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 26 26 20 63 6f 6f  & nData>1 && coo
b4f0: 72 64 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  rdChange ){.    
b500: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
b510: 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
b520: 65 20 72 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  e r-tree */.    
b530: 52 74 72 65 65 4e 6f 64 65 20 2a 70 4c 65 61 66  RtreeNode *pLeaf
b540: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 6e   = 0;.    if( !n
b550: 65 77 52 6f 77 69 64 56 61 6c 69 64 20 29 7b 0a  ewRowidValid ){.
b560: 20 20 20 20 20 20 72 63 20 3d 20 72 74 72 65 65        rc = rtree
b570: 4e 65 77 52 6f 77 69 64 28 70 52 74 72 65 65 2c  NewRowid(pRtree,
b580: 20 26 63 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a   &cell.iRowid);.
b590: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 6f 77 69      }.    *pRowi
b5a0: 64 20 3d 20 63 65 6c 6c 2e 69 52 6f 77 69 64 3b  d = cell.iRowid;
b5b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b5c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b5d0: 72 63 20 3d 20 43 68 6f 6f 73 65 4c 65 61 66 28  rc = ChooseLeaf(
b5e0: 70 52 74 72 65 65 2c 20 26 63 65 6c 6c 2c 20 30  pRtree, &cell, 0
b5f0: 2c 20 26 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  , &pLeaf);.    }
b600: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b610: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b620: 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 70  int rc2;.      p
b630: 52 74 72 65 65 2d 3e 69 52 65 69 6e 73 65 72 74  Rtree->iReinsert
b640: 48 65 69 67 68 74 20 3d 20 2d 31 3b 0a 20 20 20  Height = -1;.   
b650: 20 20 20 72 63 20 3d 20 72 74 72 65 65 49 6e 73     rc = rtreeIns
b660: 65 72 74 43 65 6c 6c 28 70 52 74 72 65 65 2c 20  ertCell(pRtree, 
b670: 70 4c 65 61 66 2c 20 26 63 65 6c 6c 2c 20 30 29  pLeaf, &cell, 0)
b680: 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6e 6f  ;.      rc2 = no
b690: 64 65 52 65 6c 65 61 73 65 28 70 52 74 72 65 65  deRelease(pRtree
b6a0: 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , pLeaf);.      
b6b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b6c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
b6d0: 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
b6e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
b6f0: 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 20 2a  hange the data *
b700: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
b710: 54 45 5f 4f 4b 20 26 26 20 6e 44 61 74 61 3e 31  TE_OK && nData>1
b720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b730: 73 74 6d 74 20 2a 70 55 70 20 3d 20 70 52 74 72  stmt *pUp = pRtr
b740: 65 65 2d 3e 70 57 72 69 74 65 41 75 78 3b 0a 20  ee->pWriteAux;. 
b750: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 69     int jj;.    i
b760: 6e 74 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  nt nChange = 0;.
b770: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
b780: 5f 69 6e 74 36 34 28 70 55 70 2c 20 31 2c 20 63  _int64(pUp, 1, c
b790: 65 6c 6c 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20  ell.iRowid);.   
b7a0: 20 61 73 73 65 72 74 28 20 70 52 74 72 65 65 2d   assert( pRtree-
b7b0: 3e 6e 41 75 78 3e 3d 31 20 29 3b 0a 20 20 20 20  >nAux>=1 );.    
b7c0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
b7d0: 65 5f 6e 6f 63 68 61 6e 67 65 28 61 44 61 74 61  e_nochange(aData
b7e0: 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  [2]) ){.      sq
b7f0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
b800: 70 55 70 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  pUp, 2);.    }el
b810: 73 65 7b 0a 20 20 20 20 20 20 47 65 6f 50 6f 6c  se{.      GeoPol
b820: 79 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  y *p = 0;.      
b830: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
b840: 65 5f 74 79 70 65 28 61 44 61 74 61 5b 32 5d 29  e_type(aData[2])
b850: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 0a 20 20  ==SQLITE_TEXT.  
b860: 20 20 20 20 20 26 26 20 28 70 20 3d 20 67 65 6f       && (p = geo
b870: 70 6f 6c 79 46 75 6e 63 50 61 72 61 6d 28 30 2c  polyFuncParam(0,
b880: 20 61 44 61 74 61 5b 32 5d 2c 20 26 72 63 29 29   aData[2], &rc))
b890: 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 72 63  !=0.       && rc
b8a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
b8b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
b8c0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
b8d0: 55 70 2c 20 32 2c 20 70 2d 3e 68 64 72 2c 20 34  Up, 2, p->hdr, 4
b8e0: 2b 38 2a 70 2d 3e 6e 56 65 72 74 65 78 2c 20 53  +8*p->nVertex, S
b8f0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
b900: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
b920: 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 2c 20 32  ind_value(pUp, 2
b930: 2c 20 61 44 61 74 61 5b 32 5d 29 3b 0a 20 20 20  , aData[2]);.   
b940: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b950: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
b960: 20 20 6e 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20    nChange = 1;. 
b970: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 6a 3d     }.    for(jj=
b980: 31 3b 20 6a 6a 3c 70 52 74 72 65 65 2d 3e 6e 41  1; jj<pRtree->nA
b990: 75 78 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ux; jj++){.     
b9a0: 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20   nChange++;.    
b9b0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76    sqlite3_bind_v
b9c0: 61 6c 75 65 28 70 55 70 2c 20 6a 6a 2b 32 2c 20  alue(pUp, jj+2, 
b9d0: 61 44 61 74 61 5b 6a 6a 2b 32 5d 29 3b 0a 20 20  aData[jj+2]);.  
b9e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 61    }.    if( nCha
b9f0: 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nge ){.      sql
ba00: 69 74 65 33 5f 73 74 65 70 28 70 55 70 29 3b 0a  ite3_step(pUp);.
ba10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ba20: 65 33 5f 72 65 73 65 74 28 70 55 70 29 3b 0a 20  e3_reset(pUp);. 
ba30: 20 20 20 7d 0a 20 20 7d 0a 0a 67 65 6f 70 6f 6c     }.  }..geopol
ba40: 79 5f 75 70 64 61 74 65 5f 65 6e 64 3a 0a 20 20  y_update_end:.  
ba50: 72 74 72 65 65 52 65 6c 65 61 73 65 28 70 52 74  rtreeRelease(pRt
ba60: 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ree);.  return r
ba70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  c;.}../*.** Repo
ba80: 72 74 20 74 68 61 74 20 67 65 6f 70 6f 6c 79 5f  rt that geopoly_
ba90: 6f 76 65 72 6c 61 70 28 29 20 69 73 20 61 6e 20  overlap() is an 
baa0: 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74  overloaded funct
bab0: 69 6f 6e 20 73 75 69 74 61 62 6c 65 0a 2a 2a 20  ion suitable.** 
bac0: 66 6f 72 20 75 73 65 20 69 6e 20 78 42 65 73 74  for use in xBest
bad0: 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  Index..*/.static
bae0: 20 69 6e 74 20 67 65 6f 70 6f 6c 79 46 69 6e 64   int geopolyFind
baf0: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
bb00: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
bb10: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 63  .  int nArg,.  c
bb20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
bb30: 2c 0a 20 20 76 6f 69 64 20 28 2a 2a 70 78 46 75  ,.  void (**pxFu
bb40: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
bb50: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
bb60: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
bb70: 64 20 2a 2a 70 70 41 72 67 0a 29 7b 0a 20 20 69  d **ppArg.){.  i
bb80: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
bb90: 6d 70 28 7a 4e 61 6d 65 2c 20 22 67 65 6f 70 6f  mp(zName, "geopo
bba0: 6c 79 5f 6f 76 65 72 6c 61 70 22 29 3d 3d 30 20  ly_overlap")==0 
bbb0: 29 7b 0a 20 20 20 20 2a 70 78 46 75 6e 63 20 3d  ){.    *pxFunc =
bbc0: 20 67 65 6f 70 6f 6c 79 4f 76 65 72 6c 61 70 46   geopolyOverlapF
bbd0: 75 6e 63 3b 0a 20 20 20 20 2a 70 70 41 72 67 20  unc;.    *ppArg 
bbe0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
bbf0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
bc00: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
bc10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
bc20: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
bc30: 65 2c 20 22 67 65 6f 70 6f 6c 79 5f 77 69 74 68  e, "geopoly_with
bc40: 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  in")==0 ){.    *
bc50: 70 78 46 75 6e 63 20 3d 20 67 65 6f 70 6f 6c 79  pxFunc = geopoly
bc60: 57 69 74 68 69 6e 46 75 6e 63 3b 0a 20 20 20 20  WithinFunc;.    
bc70: 2a 70 70 41 72 67 20 3d 20 30 3b 0a 20 20 20 20  *ppArg = 0;.    
bc80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e  return SQLITE_IN
bc90: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  DEX_CONSTRAINT_F
bca0: 55 4e 43 54 49 4f 4e 2b 31 3b 0a 20 20 7d 0a 20  UNCTION+1;.  }. 
bcb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73   return 0;.}...s
bcc0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
bcd0: 64 75 6c 65 20 67 65 6f 70 6f 6c 79 4d 6f 64 75  dule geopolyModu
bce0: 6c 65 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20  le = {.  3,     
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
bd10: 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 72 65   */.  geopolyCre
bd20: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
bd30: 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63    /* xCreate - c
bd40: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f  reate a table */
bd50: 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6e 6e 65 63  .  geopolyConnec
bd60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
bd70: 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e  * xConnect - con
bd80: 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74  nect to an exist
bd90: 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 67  ing table */.  g
bda0: 65 6f 70 6f 6c 79 42 65 73 74 49 6e 64 65 78 2c  eopolyBestIndex,
bdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
bdc0: 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
bdd0: 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
bde0: 74 65 67 79 20 2a 2f 0a 20 20 72 74 72 65 65 44  tegy */.  rtreeD
bdf0: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
be00: 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
be10: 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63  nect - Disconnec
be20: 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a  t from a table *
be30: 2f 0a 20 20 72 74 72 65 65 44 65 73 74 72 6f 79  /.  rtreeDestroy
be40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
be50: 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72  /* xDestroy - Dr
be60: 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  op a table */.  
be70: 72 74 72 65 65 4f 70 65 6e 2c 20 20 20 20 20 20  rtreeOpen,      
be80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
be90: 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75  Open - open a cu
bea0: 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65 65 43  rsor */.  rtreeC
beb0: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
bec0: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
bed0: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
bee0: 20 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 46 69 6c   */.  geopolyFil
bef0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
bf00: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
bf10: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
bf20: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 72  nstraints */.  r
bf30: 74 72 65 65 4e 65 78 74 2c 20 20 20 20 20 20 20  treeNext,       
bf40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
bf50: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
bf60: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 72 74 72 65  cursor */.  rtre
bf70: 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  eEof,           
bf80: 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
bf90: 2a 2f 0a 20 20 67 65 6f 70 6f 6c 79 43 6f 6c 75  */.  geopolyColu
bfa0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mn,             
bfb0: 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65   /* xColumn - re
bfc0: 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72  ad data */.  rtr
bfd0: 65 65 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  eeRowid,        
bfe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
bff0: 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
c000: 2f 0a 20 20 67 65 6f 70 6f 6c 79 55 70 64 61 74  /.  geopolyUpdat
c010: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c020: 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72 69  /* xUpdate - wri
c030: 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 72 74 72  te data */.  rtr
c040: 65 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  eeBeginTransacti
c050: 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 67  on,      /* xBeg
c060: 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61 6e 73  in - begin trans
c070: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65  action */.  rtre
c080: 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c  eEndTransaction,
c090: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
c0a0: 20 2d 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74   - sync transact
c0b0: 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45 6e  ion */.  rtreeEn
c0c0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  dTransaction,   
c0d0: 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
c0e0: 2d 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63  - commit transac
c0f0: 74 69 6f 6e 20 2a 2f 0a 20 20 72 74 72 65 65 45  tion */.  rtreeE
c100: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  ndTransaction,  
c110: 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
c120: 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ck - rollback tr
c130: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 67  ansaction */.  g
c140: 65 6f 70 6f 6c 79 46 69 6e 64 46 75 6e 63 74 69  eopolyFindFuncti
c150: 6f 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46  on,        /* xF
c160: 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75  indFunction - fu
c170: 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
c180: 6e 67 20 2a 2f 0a 20 20 72 74 72 65 65 52 65 6e  ng */.  rtreeRen
c190: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
c1a0: 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
c1b0: 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
c1c0: 65 20 2a 2f 0a 20 20 72 74 72 65 65 53 61 76 65  e */.  rtreeSave
c1d0: 70 6f 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20  point,          
c1e0: 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
c1f0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
c220: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c240: 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f  * xRollbackTo */
c250: 0a 20 20 72 74 72 65 65 53 68 61 64 6f 77 4e 61  .  rtreeShadowNa
c260: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
c270: 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f  * xShadowName */
c280: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .};..static int 
c290: 73 71 6c 69 74 65 33 5f 67 65 6f 70 6f 6c 79 5f  sqlite3_geopoly_
c2a0: 69 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  init(sqlite3 *db
c2b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c2c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
c2d0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
c2e0: 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  .    void (*xFun
c2f0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
c300: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c310: 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 73 69  value**);.    si
c320: 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a  gned char nArg;.
c330: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
c340: 72 20 62 50 75 72 65 3b 0a 20 20 20 20 63 6f 6e  r bPure;.    con
c350: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
c360: 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a    } aFunc[] = {.
c370: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 41 72       { geopolyAr
c380: 65 61 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  eaFunc,         
c390: 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   1, 1,    "geopo
c3a0: 6c 79 5f 61 72 65 61 22 20 20 20 20 20 20 20 20  ly_area"        
c3b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c3c0: 65 6f 70 6f 6c 79 42 6c 6f 62 46 75 6e 63 2c 20  eopolyBlobFunc, 
c3d0: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 20           1, 1,  
c3e0: 20 20 22 67 65 6f 70 6f 6c 79 5f 62 6c 6f 62 22    "geopoly_blob"
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
c400: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4a 73       { geopolyJs
c410: 6f 6e 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  onFunc,         
c420: 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   1, 1,    "geopo
c430: 6c 79 5f 6a 73 6f 6e 22 20 20 20 20 20 20 20 20  ly_json"        
c440: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c450: 65 6f 70 6f 6c 79 53 76 67 46 75 6e 63 2c 20 20  eopolySvgFunc,  
c460: 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 20          -1, 1,  
c470: 20 20 22 67 65 6f 70 6f 6c 79 5f 73 76 67 22 20    "geopoly_svg" 
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
c490: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 57 69       { geopolyWi
c4a0: 74 68 69 6e 46 75 6e 63 2c 20 20 20 20 20 20 20  thinFunc,       
c4b0: 20 32 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   2, 1,    "geopo
c4c0: 6c 79 5f 77 69 74 68 69 6e 22 20 20 20 20 20 20  ly_within"      
c4d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c4e0: 65 6f 70 6f 6c 79 43 6f 6e 74 61 69 6e 73 50 6f  eopolyContainsPo
c4f0: 69 6e 74 46 75 6e 63 2c 20 33 2c 20 31 2c 20 20  intFunc, 3, 1,  
c500: 20 20 22 67 65 6f 70 6f 6c 79 5f 63 6f 6e 74 61    "geopoly_conta
c510: 69 6e 73 5f 70 6f 69 6e 74 22 20 20 20 7d 2c 0a  ins_point"   },.
c520: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 4f 76       { geopolyOv
c530: 65 72 6c 61 70 46 75 6e 63 2c 20 20 20 20 20 20  erlapFunc,      
c540: 20 32 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   2, 1,    "geopo
c550: 6c 79 5f 6f 76 65 72 6c 61 70 22 20 20 20 20 20  ly_overlap"     
c560: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c570: 65 6f 70 6f 6c 79 44 65 62 75 67 46 75 6e 63 2c  eopolyDebugFunc,
c580: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20           1, 0,  
c590: 20 20 22 67 65 6f 70 6f 6c 79 5f 64 65 62 75 67    "geopoly_debug
c5a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
c5b0: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 42 42       { geopolyBB
c5c0: 6f 78 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  oxFunc,         
c5d0: 20 31 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   1, 1,    "geopo
c5e0: 6c 79 5f 62 62 6f 78 22 20 20 20 20 20 20 20 20  ly_bbox"        
c5f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c600: 65 6f 70 6f 6c 79 58 66 6f 72 6d 46 75 6e 63 2c  eopolyXformFunc,
c610: 20 20 20 20 20 20 20 20 20 37 2c 20 31 2c 20 20           7, 1,  
c620: 20 20 22 67 65 6f 70 6f 6c 79 5f 78 66 6f 72 6d    "geopoly_xform
c630: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
c640: 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79 52 65       { geopolyRe
c650: 67 75 6c 61 72 46 75 6e 63 2c 20 20 20 20 20 20  gularFunc,      
c660: 20 34 2c 20 31 2c 20 20 20 20 22 67 65 6f 70 6f   4, 1,    "geopo
c670: 6c 79 5f 72 65 67 75 6c 61 72 22 20 20 20 20 20  ly_regular"     
c680: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 67       },.     { g
c690: 65 6f 70 6f 6c 79 43 63 77 46 75 6e 63 2c 20 20  eopolyCcwFunc,  
c6a0: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 20           1, 1,  
c6b0: 20 20 22 67 65 6f 70 6f 6c 79 5f 63 63 77 22 20    "geopoly_ccw" 
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
c6d0: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
c6e0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
c6f0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
c700: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
c710: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
c720: 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20 28  e**);.    void (
c730: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
c740: 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20  _context*);.    
c750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c760: 65 3b 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d 20  e;.  } aAgg[] = 
c770: 7b 0a 20 20 20 20 20 7b 20 67 65 6f 70 6f 6c 79  {.     { geopoly
c780: 42 42 6f 78 53 74 65 70 2c 20 67 65 6f 70 6f 6c  BBoxStep, geopol
c790: 79 42 42 6f 78 46 69 6e 61 6c 2c 20 22 67 65 6f  yBBoxFinal, "geo
c7a0: 70 6f 6c 79 5f 67 72 6f 75 70 5f 62 62 6f 78 22  poly_group_bbox"
c7b0: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
c7c0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c7d0: 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 29 2f  i<sizeof(aFunc)/
c7e0: 73 69 7a 65 6f 66 28 61 46 75 6e 63 5b 30 5d 29  sizeof(aFunc[0])
c7f0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c800: 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  K; i++){.    int
c810: 20 65 6e 63 20 3d 20 61 46 75 6e 63 5b 69 5d 2e   enc = aFunc[i].
c820: 62 50 75 72 65 20 3f 20 53 51 4c 49 54 45 5f 55  bPure ? SQLITE_U
c830: 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52  TF8|SQLITE_DETER
c840: 4d 49 4e 49 53 54 49 43 20 3a 20 53 51 4c 49 54  MINISTIC : SQLIT
c850: 45 5f 55 54 46 38 3b 0a 20 20 20 20 72 63 20 3d  E_UTF8;.    rc =
c860: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c870: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75  function(db, aFu
c880: 6e 63 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75  nc[i].zName, aFu
c890: 6e 63 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20  nc[i].nArg,.    
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 63               enc
c8c0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78        aFunc[i].x
c8f0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
c900: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
c910: 7a 65 6f 66 28 61 41 67 67 29 2f 73 69 7a 65 6f  zeof(aAgg)/sizeo
c920: 66 28 61 41 67 67 5b 30 5d 29 20 26 26 20 72 63  f(aAgg[0]) && rc
c930: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
c940: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c950: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c960: 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b 69 5d 2e  ion(db, aAgg[i].
c970: 7a 4e 61 6d 65 2c 20 31 2c 20 53 51 4c 49 54 45  zName, 1, SQLITE
c980: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 61 41             0, aA
c9b0: 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67  gg[i].xStep, aAg
c9c0: 67 5b 69 5d 2e 78 46 69 6e 61 6c 29 3b 0a 20 20  g[i].xFinal);.  
c9d0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c9e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c9f0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
ca00: 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22  _module_v2(db, "
ca10: 67 65 6f 70 6f 6c 79 22 2c 20 26 67 65 6f 70 6f  geopoly", &geopo
ca20: 6c 79 4d 6f 64 75 6c 65 2c 20 30 2c 20 30 29 3b  lyModule, 0, 0);
ca30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ca40: 3b 0a 7d 0a                                      ;.}.